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


         

В частности, Вам придется создать


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

Создав порт завершения ввода-вывода. Вы сопоставляете с ним задание, вызывая 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

<

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий