Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.20;
Скачать: CL | DM;

Вниз

Объясните мне работу с TEvent ... и WaitForSingleObject   Найти похожие ветки 

 
Aleksandr ©   (2003-08-01 17:11) [0]

В программе один поток, создав коллекцию команд, передает их другому потоку и должен дождаться, когда тот эти команды выполнит. Насколько я понимаю, схема должна работать по принципу создания TEvent, а затем ожидания чего-то с ним. То есть что-то вроде:

var
DataEvent : TEvent;
...
Coll.Add(TRiCommand.CreateSetEvent(Self.Handle));
// добавили в конец коллекции команду что-то делать с эвентом
DataEvName:=StrNew(PChar(FCommandInfo.Name+IntToStr(GetTickCount)));
try
DataEvent:=CreateEvent(nil,true,false,DataEvName);
try
DataExTime:=0;
CommandManager.ProcessCommands(Coll);
repeat
WaitResult:=WaitForSingleObject(DataEvent, ContSesRefreshInterval);
Inc(DataExTime, ContSesRefreshInterval);
Sleep(50);
until (WaitResult = WAIT_OBJECT_0)
OR (WaitResult = WAIT_FAILED)
OR (DataExTime>TimeToProcessCommands);
finally
CloseHandle(DataEvent)
end; ...


Реально эту схему я срисовал с подобной в справочнике, но там авторы забыли объяснить ее смысел и что должен сделать поток, в который команды были переданы, наткнувшись на команду что-то сделать с эвентом и имея Handle создавшего Event потока. Судя по хэлпу, он должен сделать SetEvent, но сделать его он не может, потому что передать ему эвент нельзя (свойства не допускают этого). Может, специалисты в вопросе мне объяснят, что к чему, чего должен WaitForSingleObject (откуда возъмется Wait_Failed) и что должен сделать поток, получивший комманды?


 
Набережных С. ©   (2003-08-01 19:33) [1]

DataEvent: THandle;
DataEvent:=CreateEvent(nil,false,false, nil);
InitData(SomeData);
SendToSomeThread(SomeDate, DataEvent)
case WaitForSingleObject(Dataevent, SomeInterval) of
Wait_Object_0: NextOperationsForSuccessfullyProcessing;
Wait_Abandoned_0: OperationsForUnsuccessfulWaiting;
Wait_TimeOut: OperationsForExceedingTimeOut;
end;

SomeThread:
ProcessingData(SomeData);
SetEvent(DataEvent);


 
Aleksandr ©   (2003-08-15 16:18) [2]

Мда, так я и не понял простых вещей - в каких случаях результатом ожидания станет Wait_Failed, Wait_TimeOut или Wait_Abandoned_0 :(


 
Reindeer Moss Eater ©   (2003-08-15 16:20) [3]

Wait_TimeOut
Понятно без слов.

Wait_Abandoned_0
Поток создавший объект синхронизации умер, не освободив объект.


 
Aleksandr ©   (2003-08-15 16:31) [4]

Такс... то есть, если в коде

repeat
WaitResult:=WaitForSingleObject(DataEvent, ContSesRefreshInterval);
Inc(DataExTime, ContSesRefreshInterval);
Sleep(50);
until (WaitResult = WAIT_OBJECT_0)
OR (WaitResult = WAIT_FAILED)
OR (DataExTime>TimeToProcessCommands);

по первому кругу SetEvent не был выполнен, то WaitResult станет = Wait_TimeOut? A Wait_Abandoned_0 для данного случая вообще не имеет смысла, так как проверяется в том же потоке, что и был создан?

И, все таки, а что же породит Wait_Failed???


 
Reindeer Moss Eater ©   (2003-08-15 16:37) [5]

Если Wait_Failed, то ожидание и не начиналось.

If the function fails, the return value is WAIT_FAILED. To get extended error information, call GetLastError.


 
Aleksandr ©   (2003-08-15 16:38) [6]

Понял, спасибо.



Страницы: 1 вся ветка

Текущий архив: 2003.10.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
4-65670
Prov
2003-08-13 17:09
2003.10.20
Canvas - WinAPI


1-65438
Aleksandr
2003-10-07 16:24
2003.10.20
Как трассировать DLL?


7-65658
prihod
2003-08-05 17:38
2003.10.20
Есть ли звук на компе ???


3-65329
Nucl
2003-09-29 11:28
2003.10.20
Странное поведение ADO Query


14-65577
Help
2003-10-02 13:54
2003.10.20
Про dll