Неверный параметр при связывании множества заданий с портом завершения ввода-вывода

Учтите следующее:

void SomeClass::associateCompletionPort(HANDLE hJob) {
  JOBOBJECT_ASSOCIATE_COMPLETION_PORT jacp = { 0 };
  jacp.CompletionKey = hJob;
  jacp.CompletionPort = hCompletionPort;

  if (!SetInformationJobObject(
    hJob,
    JobObjectAssociateCompletionPortInformation,
    &jacp,
    sizeof(jacp))) {
    // open a 'pop-up' with an error message, of the last error encountered.
    dumpLastError(TEXT("SetInformationJobObject"));
  }
}

1.hCompletionPort инициализируется в конструкторе SomeClass, как это:

SomeClass::SomeClass() : 
  hCompletionPort(CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1)) {
  if (!hCompletionPort) {
    dumpLastError(TEXT("CreateIoCompletionPort"));
  }
}

2.hJob РУЧКА к объекту задания, который "содержит" только один процесс; 3.Этот метод вызывается для нескольких объектов заданий, поэтому при сопоставлении заданий с портом завершения существует сопоставление "один ко многим";

Примечание. Это часть кода, который я использую для получения сообщений каждый раз, когда определенный предел превышается / нарушается, позже.

Я проверяю это, запуская рассматриваемые процессы (ограниченные одним объектом задания каждый) перед запуском этого конкретного фрагмента.

Эта проблема:

Каждый раз, когда объект задания связывается с портом завершения, связывание завершается неудачно с:

SetInformationJobObject завершился ошибкой 87; Неверный параметр.

Но самое неловкое, что в редких случаях все работает нормально. Я могу подтвердить это, потому что я получаю ожидаемые сообщения в другой части кода, куда я звоню GetQueuedCompletionStatus,

Например, когда я впервые запустил это несколько часов назад, все работало, как ожидалось. Но после этого он всегда выдавал одно и то же сообщение об ошибке, и, конечно, я никогда не ловил сообщения о нарушении ограничений.

0 ответов

Другие вопросы по тегам