Завершение всех процессов в задании
Возможность завершения всех процессов задания – наиболее распространенный вариант применения заданий. Часто задание используют просто как контейнер процессов, который не налагает на них ограничения, но позволяет завершить все входящие в него процессы (и их потомков) вызовом всего лишь одной операции. Для того чтобы завершить все процессы задания достаточно указать само задание и код возврата, который будет одним для всех процессов: BOOL TerminateJobObject(HANDLE hJob, UINT exitCode); Статистика задания Помимо ограничений, задание хранит статистическую информацию всех включенных в него процессов, в том числе уже завершившихся. К примеру, можно определить время выполнения процессов задания в пользовательском режиме и в режиме ядра, текущее количество процессов в задании и т.д. Для получения сведений о задании, в том числе и о действующих ограничениях, следует использовать функцию QueryInformationJobObject, передав ей объект-задание hJob и вид запрашиваемой информации jobInfoClass: BOOL QueryInformationJobObject( HANDLE hJob, JOBOBJECTINFOCLASS jobInfoClass, LPVOID jobInfo, DWORD jobInfoSize, LPDWORD returnLength); Следующий пример демонстрирует, как определить общее время выполнения всех процессов задания: // Определение статистической информации JOBOBJECT_BASIC_ACCOUNTING_INFORMATION info; QueryInformationJobObject(hJob, JobObjectBasicAccountingInformation, &info, sizeof(info), NULL); // Подсчет общего времени выполнения процессов задания LONGLONG totalTime = info.TotalUserTime.QuadPart + info.TotalKernelTime.QuadPart;
Глава 5. Окна Окно является системным объектом, обеспечивающим взаимодействие приложения с пользователем, другими приложениями и самой операционной системой. При этом между элементами управления не делается никакой разницы – все они являются окнами ОС Windows. User-объекты Окна являются «пользовательскими» (user) объектами, то есть создаются в контексте определенного процесса и на протяжении своего существования связаны только с ним. Иначе говоря, когда уничтожается процесс, уничтожаются и его user-объекты (если они не были удалены ранее). User-объекты не являются объектами ядра, у них нет счетчика числа пользователей, следовательно, и необходимости в вызове функции CloseHandle также нет. Дескриптор user-объекта создается в единственном экземпляре для конкретного процесса, но это не говорит о том, что доступ к нему может иметь только процесс-создатель. В общем случае доступ к user-объекту можно получить и из другого процесса, однако последнему не дается никаких гарантий, что на момент обращения к данному объекту он еще будет существовать. Очередь сообщений Изменения в состоянии аппаратных средств, самой операционной системе, других исполняющихся в данный момент приложениях, которые могут оказать воздействие на ход выполнения задачи, называются событиями. Приложения извещаются о событиях через сообщения, которые им посылает операционная система. Большинство приложений Windows простаивают, ожидая поступления сообщений от операционной системы. Поэтому программирование GUI (п. 2.1) в среде Windows зачастую сводится к выбору сообщений, которые будут обрабатываться, и написании соответствующего кода для их обработки. Создавая какой-либо поток, система предполагает, что он не будет иметь отношения к поддержке пользовательского интерфейса. Это позволяет уменьшить объем выделяемых ему системных ресурсов. Но как только поток обратится к той или иной GUI-функции (например, для проверки очереди сообщений или создания окна), система автоматически выделит ему дополнительные ресурсы, необходимые для выполнения задач, связанных с пользовательским интерфейсом. А если конкретнее, то система создает очередь сообщений, в которую направляются все сообщения, адресованные потоку (окнам, созданным в контексте данного потока). Чтобы окно, в конечном счете, получило эти сообщения, поток должен иметь собственный цикл выборки сообщений. Кроме возможности принимать и обрабатывать поступающие сообщения существует возможность самостоятельно посылать (генерировать) сообщения. Сообщение можно послать двумя разными способами: асинхронно и синхронно. При асинхронной посылке сообщений возврат управления происходит сразу после того, как сообщение поставлено в очередь, поэтому вызывающий поток остается в неведении, обработано ли данное сообщение или нет. Более того, возможны ситуации, когда поток завершиться раньше и не обработает все сообщения из своей очереди. При синхронной посылке сообщений возврат управления происходит только после того, как закончится обработка данного сообщения. ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|