Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.177 c
14-65631
Empleado
2003-09-30 19:32
2003.10.20
Вопрос про internet


3-65393
Nick-From
2003-09-05 14:18
2003.10.20
Избежание переполнения таблиц


3-65365
MVVD
2003-09-29 12:44
2003.10.20
Чудеса с сервером


4-65670
Prov
2003-08-13 17:09
2003.10.20
Canvas - WinAPI


14-65579
Anatoly Podgoretsky
2003-10-02 13:17
2003.10.20
Подробности по мылу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский