Форум: "WinAPI";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
ВнизОбъясните мне работу с 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c