Windows для профессионалов


Уведомления заданий - часть 2


В частности, Вам придется создать объект ядра "порт завершения ввода-вывода" и связать с ним объект или объекты "задание". После этого нужно будет перевести один или больше потоков в режим ожидания порта завершения.

Создав порт завершения ввода-вывода. Вы сопоставляете с ним задание, вызывая SetInformationJobObject следующим образом:

JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;

joacp.CompletionKey = 1;
// любое значение, уникально идентифицирующее это задание

joacp.CompletionPort = hIOCP;
// описатель порта завершения, принимающего уведомления

SetInformationJobObject(hJob, JobObjectAssociateCompletionPortInforrration, &jоаср, sizeof(joacp))

После выполнения этого кода система начнет отслеживать задание и при возникновении событий передавать их порту завершения. (Кстати, Вы можете вызывать QueryInformationJobQbjectw получать ключ завершения и описатель порта, но вряд ли это Вам когда-нибудь понадобится.) Потоки следят за портом завершения ввода-вывода, вызывая GetQueuedCompletionStatus.

BOOL GetQueuedCompletionStatus( HANDLE hIOCP, PDWORD pNumBytesTransferred, PULONG_PTR pCorripletionKey, POVERLAPPED *pOverlapped, DWORD dwMilliseconds);

Когда эта функция возвращает уведомление о событии задания, *pCompletionKey содержит значение ключа завершения, заданное при вызове SetInformationJobObject для связывания задания с портом завершения. По нему Вы узнаете, в каком из заданий возникло событие. Значение в *pNumBytesTransferred указывет какое именно событие произошло (таблица 5-4). В зависимости от конкретного события в *pOverlapped может возвращаться идентификатор процесса.

Событие

Описание

JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO

В задании нет работающих процессов

JOB_OBJECT_MSG_END_OF_PROCESS_TIME

Процессорное время, выделенное процессу, исчерпано, процесс завершается, и сообщается его идентификатор

JOB_OBJECT_ MSG_ACTIVE_ROCESS_LIMIT

Была попытка превысить ограничение на число активных процессов в задании

JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT

Была попытки превысить ограничение на объем памяти, которая может быть передана процессу, сообщается идентификатор процесса

JOB_OBJECT_MSG_JOB_ MEMORY_LIMIT

Была попытка превысить ограничение на объем памяти, которая может быть передана заданию; сообщается идентификатор процесса

JOB_OBJECT_MSG_NEW_ PROCESS

В задание добавлен процесс; сообщается идентификатор процесса

JOB_OBJECT_MSG_EXIT_ PROCESS

Процесс завершен, сообщается идентификатор процесса

JOB_OBJECT_MSG_ABNOKMAL._EXIT_PROCESS

Процесс завершен из за необработанного им исключения; сообщается идентификатор процесса

JOB_OBJECT_MSG_END_ OFJOR_TIME

Процессорное время, выделенное заданию, исчерпано, процессы не завершаются, и Вы можете либо возобновить их работу, задав новый лимит по времени, либо самостоятельно завершить процессы, вызвав TerminateJobObject

<


Начало  Назад  Вперед