Попытался я реализовать вашу идею и что не получается. не подскажите в чем косяк?
Код:
while not Terminated do
begin
case WaitForMultipleObjects(3, @FHandles[0]{or @FHandles}, False , INFINITE) of
WAIT_FAILED:
RaiseLastOsError;
WAIT_OBJECT_0:
Terminate;
WAIT_OBJECT_0 + 1:
begin
//some work
end;
WAIT_OBJECT_0 + 2:
begin
AddLogEvent;// сюда мы не попадаем.
end;
end;
end;
end;
Код:
thr= class(TThread)
private
FHandles: array[0..2] of THandle;
FLock: TCriticalSection;
fLogEvent: string;
...
function GetLogEvent: string;
procedure SetLogEvent(const Value: string);
...
protected
...
procedure AddLogEvent;
public
...
published
...
property LogEvent: string read GetLogEvent write SetLogEvent;
...
end;
Код:
procedure Thr.SetLogEvent(const Value: string);
begin
FLock.Enter;
try
if Value <> fLogEvent then
begin
fLogEvent := Value;
SetEvent(FHandles[2])
end;
finally
Flock.leave;
end;
Код:
constructor Thr.Create(...);
begin
inherited Create(False);
FHandles[0] := CreateEvent(nil, False, False, nil);
// Управление завершением потока
FHandles[1] := CreateEvent(nil, true, true, nil); // Управление паузой
FHandles[2] := CreateEvent(nil, True, True, nil); // LogEvent
....
SetEvent(FHandles[2]); //тестовый вызов, который не срабатывает
end;
Читал другие сайты, якобы нужно юзать WaitForSinglObject, но ведь WAIT_OBJECT_0 и WAIT_OBJECT_0+1 срабатывает?
и не уверен, что передавать нужно @FHandles[0] или @FHandles?