Здавалка
Главная | Обратная связь

Завершение всех процессов в задании



Возможность завершения всех процессов задания – наиболее распространенный вариант применения заданий. Часто задание используют просто как контейнер процессов, который не налагает на них ограничения, но позволяет завершить все входящие в него процессы (и их потомков) вызовом всего лишь одной операции.

Для того чтобы завершить все процессы задания достаточно указать само задание и код возврата, который будет одним для всех процессов:

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 Все права принадлежат авторам размещенных материалов.