Есть несколько потоков которые ожидают Event, но тут есть одна проблема что при вызове PulseEvent потоки не всегда успевают перейти в ожидание, в этом примере после создания потоков делаем задержку 1500мс и все работает, но как сделать по-нормальному? Ни чего кроме как ZwQuerySystemInformation(SYSTEM_PROCESSES_AND_THREADS_INFORMATION) и там уже проверять в каком состоянии поток находится больше в голову не приходит, но этот способ не сказал бы что лучше т.к. еще и в цикле придется проверять и ждать.
Код | program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, windows;
var tid: DWORD; evnt: DWORD; mut: DWORD;
procedure Th1(p: PChar); stdcall; var dwWaitResult: DWORD; begin
while true do begin
dwWaitResult := WaitForSingleObject(evnt, INFINITE);
if (dwWaitResult = WAIT_OBJECT_0) then writeln('th1Signale');
end;
end;
procedure Th2(p: PChar); stdcall; var dwWaitResult: DWORD; begin
while true do begin dwWaitResult := WaitForSingleObject(evnt, INFINITE);
if (dwWaitResult = WAIT_OBJECT_0) then writeln('th2Signale');
end;
end;
procedure Th3(p: PChar); stdcall; var dwWaitResult: DWORD; begin while true do begin dwWaitResult := WaitForSingleObject(evnt, INFINITE);
if (dwWaitResult = WAIT_OBJECT_0) then writeln('th3Signale');
end;
end;
begin evnt := CreateEvent(nil, true, FALSE, nil);
CreateThread(nil, 0, @Th1, nil, 0, tid); CreateThread(nil, 0, @Th2, nil, 0, tid); CreateThread(nil, 0, @Th3, nil, 0, tid);
sleep(1500); PulseEvent(evnt);
readln; end.
|
|