точки зору така проблема встає, коли нужно в рамках вашого Додатках віконаті додаток, Створений кімось іншім, або, Наприклад, сеанс MS-DOS.
Розглянемо, як, власне, один процес может породіті Інший. Замість застарілої и підтрімуваної Тільки для сумісності Функції winExec, что перекочувала з колішніх версій Windows, набагато правільніше використовуват могутнішу:
function CreateProcess (IpApplicationName: PChar; IpCorranandLine: PChar;
IpProcessAttributes, IpThreadAttributes: PSecurityAttributes;
blnheritHandles: BOOL;
dwCreationFlags: DWORD; IpEnvironment: Pointer;
IpCurrentDirectory: PChar;
const IpStartupInfo: TStartupInfo;
var IpProcessInformation: TProcessInformation): BOOL;
Перші два параметри Ясні - це имя Додатках, что запускається, и передавані Йому в командному рядку параметрами. Параметр dwCreationFlags містіть флаги, что візначають способ создания нового процеса и его Майбутній Пріоритет. Вікорістані у наведеному нижчих лістингу прапори означаються: CREATE_NEW_CONSOLE - буде запущено новий консольних додаток з окремим вікном; NORMAL_PRIORITY_CLASS - нормальний Пріоритет. p> Структура TStartupInfo містіть Відомості про розмір, колір, положення вікна створюваного додатка. У ніжченаведеному прікладі (лістінг 29.1) вікорістовується поле wshowwindow: встановлений прапор SW_SHOWNORMAL, что означає візуалізацію вікна з Нормальних розміром.
На віході Функції заповнюється структура IpProcessInformation. У ній програмісту повертаються дескриптори и ідентіфікаторі створеня процеса и его первинного потоку. Нам Знадоби дескриптор процеса - у нашому прікладі створюється консольних додаток, потім відбувається Очікування его завершення. В«ПросигналитьВ» нам про це самє об'єкт IpProcessInformation.hProcess.
Лістінг 29.1. Породження Дочірнього процеса
var
IpStartupInfo: TStartupInfo;
IpProcessInformation: TProcessInformation;
begin
FillChar (IpStartupInfo, Sizeof (IpStartupInfo), 10);
IpStartupInfo.cb: = Sizeof (IpStartupInfo);
IpStartupInfo.dwFlags: = STARTFJJSESHOWWINDOW; IpStartupInfo.wShowWindow: = SW_SHOWNORMAL;
if not CreateProcess (nil,
PChar ('ping localhost'),
nil,
nil,
false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,
nil,
IpStartupInfo, IpProcessInformation) then
ShowMessage (SysErrorMessage (GetLastError ;)
else
begin
WaitForSingleObject
(IpProcessInformation.hProcess, 10000); CloseHandle (IpProcessInformation.hProcess);
end;
end;
Потік
Потік может чекати Інший Потік точно так, як и Інший процес. Очікування можна організуваті помощью функцій API (як в Тільки что Розглянуто прікладі), альо зручніше це сделать с помощью методу TThread. WaitFor. p> консольних Введення
консольних введення (console input) годитися для потоків, Які повінні чекати відгуку на натіснення користувачем клавіші на клавіатурі. Цею тип Очікування может буті використаних у Програмі дуплексного зв'язку (chat). Один Потік при цьом чекатіме Отримання сімволів; другий - відстежуваті Введення користувача і потім посілаті Набрань текст чекаючому Додатках.
Сповіщення про зміну у файловій Системі
цею вид об'єкту Очікування Дуже цікавий и незаслужено мало відомій. Мі розглянулі практично ВСІ Варіанти того, як один Потік может податі сигнал Іншому. А як здобудуть сигнал від операційної системи? Ну, Наприклад, про ті, что у файловій Системі відбуліся якісь Зміни? Такий вид сповіщення з ОС UNIX и Доступний програмістам, что Працюють з Win32. Для організації МОНІТОРИНГУ файлової системи нужно використовуват
Три Функції - FindFirstChangeNotification, FindNextChangeNotification и FinddoseChangeNotification. Перша з них повертає дескриптор об'єкту файлового сповіщення, Який можна Передат у функцію Очікування. Об'єкт актівізується тоді, коли в заданій теці відбуліся ті або Другие Зміни (создания або знищення файлу або теки, зміна прав доступу и т. д.). Друга - готовит об'єкт до Реакції на Наступний зміну. Нарешті, за помощью третьої Функції слід закрити тієї, что ставши непотрібнім об'єкт.
Так может віглядаті код методом Execute потоку, створенного для МОНІТОРИНГУ файлової системи:
var DirName: string;
...
procedure TSimpleThread. Execute;
var r: Cardinal;
fn: THandle;
begin
fn: = FindFirstChangeNotification (pChar (DirName), True,
FILEJTOTIFY_CHANGE_FILE_NAME);
repeat
r: = WaitForSingleObject (fn, 2000);
if r = WAIT_OBOECT_0 then
Synchronize (Forml. UpdateList);
if not FindNextChangeNotification (fn) then
break;
until Terminated;
FindCloseChangeNotification (fn);
end;
...