Организация синхронизации действий процессов

  • Во время выполнения ProcessMonitor создает поток (при помощи CreateThread) в тело которого помещен цикл обработки сообщений. В цикле обработки сообщений установлены собственные обработчики WM_USER (для получения идентификатора потока дочернего процесса), WM_MYUSR1, WM_MYUSR2 сообщений. Каждый дочерний процесс в начале выполнения устанавливает собственный обработчик сообщений WM_MYUSR1 и WM_MYTERM.
  • Полностью выдержав введенный интервал ProcessMonitor перебирает, имеющийся у него список процессов. Для тех процессов, которые были успешно запущены ProcessMonitor выполняет системный вызов GetExitCodeProcess. Если процесс к этому моменту уже завершился (успешно), то будет выведено сообщение о его успешном завершении.
  • Если дочерний процесс еще не завершился, то ProcessMonitor отправляет ему сообщение WM_MYUSR1. Обработчик этого сообщения в процессе анализирует текущее состояние программы процесса. Если программа еще выполняет первый этап, то процесс отвечает родительскому процессу сообщением WM_MYUSR1, если программа уже перешла во второй этап — сообщением WM_MYUSR2.
  • ProcessMonitor (в своем обработчике этих сообщений) анализирует сообщение, полученное от дочернего процесса, и в зависимости от типа сообщения устанавливает у себя индикатор состояния данного процесса. Затем процессы, от которых было получено сообщение WM_MYUSR1, завершаются (terminateprocess), а процессам, от которых получено сообщение WM_MYUSR2, — посылается сообщение WM_MYTERM.
  • В обработчике WM_MYTERM анализируется значение переменной waitFactor, которая определяет приблизительное время, необходимое модулю a0wait для завершения этапа. Если значение этой переменной больше 1000 (что приблизительно соответствует 1 сек), то обработчик сообщения WM_MYTERM завершает процесс системным вызовом halt с кодом завершения 0. Если же значение waitFactor меньше 1000, обработчик сообщения этого не делает, после обработки сообщения процесс продолжает работать обычным образом.

************************************************************************

Модуль process_unit.pas:

unit process_unit;

Лекция 6: Планирование заданий. Взаимодействие и синхронизация процессов и потоков


Читать еще…

Понравилась статья? Поделиться с друзьями: