Неверный параметр при связывании множества заданий с портом завершения ввода-вывода
Учтите следующее:
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
,
Например, когда я впервые запустил это несколько часов назад, все работало, как ожидалось. Но после этого он всегда выдавал одно и то же сообщение об ошибке, и, конечно, я никогда не ловил сообщения о нарушении ограничений.