Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии 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 содержит значение ключа завершения, заданное при вызове SetInformationJobObjett для связывания задания с портом завершения По нему Вы узнаете, в каком из заданий возникло событие Значение в *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

<


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