i Листинг 29.1. Порождение дочернего процесса у.-^. s^v. щ±/ jt; , ::l"~V;J

var

IpStartupInfo: TStartupInfo;
IpProcessinformation: TProcessInformation;

begin FillChar(IpStartupInfo,Sizeof(IpStartupInfo) ,#0) ; IpStartupInfo.cb := Sizeof(IpStartupInfo) ; IpStartupInfo.dwFlags := STARTF_USESHOWWINDOW; 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.

Консольный ввод

Консольный ввод (console input) годится для потоков, которые должны ожидать отклика на нажатие пользователем клавиши на клавиатуре. Этот тип ожидания может быть использован в программе дуплексной связи (chat). Один поток при этом будет ожидать получения символов; второй - отслеживать ввод пользователя и затем отсылать набранный текст ожидающему приложению.

Оповещение об изменении в файловой системе

Этот вид объекта ожидания очень интересен и незаслуженно мало известен. Мы рассмотрели практически все варианты того, как один поток может подать сигнал другому. А как получить сигнал от операционной системы? Ну, например, о том, что в файловой системе произошли какие-то изменения? Такой вид оповещения позаимствован из ОС UNIX и доступен программистам, работающим с Win32.

Для организации мониторинга файловой системы нужно использовать три функции - FindFirstChangeNotification, FindNextChangeNotification И FindCloseChangeNotification. Первая из них возвращает дескриптор объекта файлового оповещения, который можно передать в функцию ожидания. Объект активизируется тогда, когда в заданной папке произошли те или иные изменения (создание или уничтожение файла или папки, изменение прав доступа и т. д.)- Вторая - готовит объект к реакции на следующее изменение. Наконец, с помощью третьей функции следует закрыть ставший ненужным объект.

Так может выглядеть код метода Execute потока, созданного для мониторинга файло вой системы:

var DirNarre : string;
procedure TSirrpleThread.Execute;
var r: Cardinal;
fn : THandle;
begin
fn := FindFirstChangeNotification(pChar(DirName) , True, FILE_NOTIFY_CHANGE_FILE_NAME);

repeat

Г :=WaitForSingleObject(fn,2000) ; if Г = WAIT_OBJECT_0 then

Synchronize(Forml.UpdateList);
if not FindNextChangeNotification(fn) then break;
until Terminated;
FindCloseChangeNotification(fn);
end;

На главной форме должны находиться компоненты, нужные для выбора обследуемой папки, а также компонент TListBox, в который будут записываться имена файлов:

procedure TForml .ButtonlClick (Sender: TObject) ;
var dir : string;
begin
if SelectDirectory(dir, [],0) then begin Fditl.Text := dir;
DixNare := dir;
end;
end;

⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Ноябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс