Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 127

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 121 122 123 124 125 126 < 127 > 128 129 130 131 132 133 .. 173 >> Следующая

else
В этом примере Process info является структурой типа PR0CESS_INF0RMATI0N, которая заполняется с помощью вызова функции :: CreateProcess. Заметим: если процесс все еще выполняется, то функция : :GetExitCodeProcess предоставляет специальное значение still_active вместо кода возврата.
Программа передает в функцию Win32 API : :WaitForSingleObject дескриптор дочернего процесса, чтобы подождать его завершения (см. гл. 22).
Программа может передавать дескриптор дочернего процесса другим функциям Win32 API, предназначенным для управления им, например, в функцию : : SetPriorityClass для изменения приоритета процесса или в функцию : :TerminateProcess для его немедленного прекращения.
Заметим: дескриптор процесса остается корректным даже после окончания процесса. Когда программа завершится с использованием дескриптора, она может закрыть его, передавая дескриптор в функцию Win32 API : : CloseHandle. Если программа не закрыла дескриптор, то он закроется автоматически при завершении программы. Когда все дескрипторы данного процесса будут закрыты, Windows освобождает память от информации, которая поддерживала процесс.
Сразу после запуска дочернего процесса отношения между двумя процессами не поддерживаются. Например, при завершении родительского процесса запущенные им дочерние в системе Windows не завершаются автоматически. Кроме того, любой процесс (не только родительский) может вызвать функцию Win32 API (например, ::WaitForInputIdle, ::GetExitCodeProcess, ::WaitForSingleObject, :: SetPriorityClass или : : TerminateProcess) для управления или ожидания окончания дочернего процесса при условии, что он имеет дескриптор этого процесса. Однако каждый процесс должен получить свой собственный дескриптор для дочернего, используя один из методов совместного использования дескрипторов, описанный в следующем разделе.
Синхронизация процессов и
получение дескрипторов общих объектов
В гл. 22 вы узнали, как четыре типа объектов синхронизации Win32 используются для синхронизации действия отдельных потоков внутри одного процесса. Три из них — мьютексы, семафоры и события — можно применять для синхронизации действий потоков внутри отдельных процессов. Вспомните: при использовании объекта синхронизации нужно передавать его дескриптор соответствующей функции Win32 API. Но, как правило, дескриптор Windows, полученный процессом (например, дескриптор мьютекса, полученный при вызове функции : : CreateMutex), не может использоваться другим процессом. Вместо этого каждый процесс должен получить свой собственный дескриптор этого объекта (исключением является дескриптор, унаследованный дочерним процессом, что объяснено в приведенной ниже врезке).
// в первом процессе: HMutex = ::CreateMutex
(NULL, // присваивает стандартные атрибуты
// защиты; не наследует дескриптор;
FALSE, // мыотекс изначально свободен;
"Acme Accounting Mutex") ; // имя мьютекса
В этом и следующих примерах предполагается, что HMutex — глобальная переменная типа handle. Второй процесс может получить дескриптор того же мьютекса, выполняя идентичный вызов функции и задавая то же имя мьютекса.
//во втором процессе: HMutex = ::CreateMutex
(NULL, // присваивает стандартные атрибуты
// защиты; не наследует дескриптор; FALSE, // мьютекс изначально свободен;
"Acme Accounting Mutex"); // имя мьютекса
Если при вызове функции : .-CreateMutex мьютекс не существует, то эта функция создает объект и возвращает дескриптор, который используется текущим процессом. Если мьютекс уже существует, то функция : : CreateMutex просто возвращает новый дескриптор того же объекта, который можно использовать в текущем процессе. Убедитесь, что мьютексу присвоено имя, которое не используется в другой программе, и что присвоенное каждой функции API оно точно совпадает с требуемым, включая регистр каждой буквы. Подробности можно найти в документации на функцию : : CreateMutex.
Аналогично несколько процессов могут совместно использовать один семафор или событие, присваивая им имя при вызове функции : :CreateSemaphore или функции : :CreateEvent. Как только один или несколько процессов получают дескрипторы общего объекта синхронизации, этот объект может использоваться отдельными потоками внутри одного процесса (см. гл. 22). Например, мьютекс можно использовать, чтобы запретить одновременный доступ к общему блоку памяти более чем одному процессу. Использование общей памяти описано далее в этой главе.
Другой способ совместного использования дескрипторов именованных объектов синхронизации — это вызов соответствующей функции Win32 : :Ореп. .. Например, если один процесс уже создал мьютекс посредством вызова
//в первом процессе: HMutex = ::CreateMutex
(NULL, // присваивает стандартные атрибуты
// защиты; дескрипторы нельзя наследовать; FALSE, // мьютекс изначально свободен;
"Acme Accounting Mutex"); // имя мьютекса;
то другой процесс мог бы получить дескриптор того же мьютекса, вызывая функцию ::OpenMutex...
// во втором процессе: HMutex = ;:OpenMutex
(MUTEX_ALL_ACCESS, // флаг доступа: разрешен
Предыдущая << 1 .. 121 122 123 124 125 126 < 127 > 128 129 130 131 132 133 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100