Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
ВнизИндекс объекта, возвращаемого MsgWaitForMultipleObjects Найти похожие ветки
← →
Riply © (2007-03-01 10:21) [0]Здравствуйте !
Допустим у нас есть следущее:const
StopEventsCount = 2;
Index_CriticalStop = 0;
Index_Stop = 1;
type
TStopEventsArr = array of THandle;
function ListenThread(EventsArr: TStopEventsArr): DWord;
var
aMsg: TMsg;
FLive: Boolean;
WaitResult : DWord;
begin
Result := 0;
FLive := True;
while FLive do
begin
WaitResult := MsgWaitForMultipleObjects(StopEventsCount, EventsArr[0], False, INFINITE, QS_POSTMESSAGE);
WriteLogFile("Wait Result " + IntToStr(WaitResult));// Записываем индекс объекта
case WaitResult of
Index_CriticalStop: EndThread(0);
Index_Stop: FLive := False;
StopEventsCount:
while PeekMessage(aMsg, INVALID_HANDLE_VALUE, 0, 0, PM_REMOVE) do
begin
if aMsg.message = NP_WM_SEND then Sleep(10000);
// Так долго делаем что-то важное ,
// что за это время в сигнальное положение перешли оба объекта
// и CriticalStop и просто Stop
end;
else Exit;
end;
end;
if not FLive then
while PeekMessage(aMsg, INVALID_HANDLE_VALUE, 0, 0, PM_REMOVE) do ClearQueue(aMsg);
end;
И тестируем какой из "сработавших объектов" нам вернет MsgWaitForMultipleObjectsprocedure TMainForm.Button1Click(Sender: TObject);
var
i: integer;
hThread: THandle;
ThreadID: DWord;
StopArr: TStopEventsArr;
begin
hThread := 0;
SetLength(StopArr, 2);
try
StopArr[0] := CreateEvent(nil, True, False, nil);
StopArr[1] := CreateEvent(nil, True, False, nil);
hThread := BeginThread(nil, 0, @ListenThread, StopArr, 0, ThreadID);
Sleep(1000);
PostThreadMessage(ThreadID, NP_WM_SEND, 0, 0);
Sleep(1000);
SetEvent(StopArr[1]);
SetEvent(StopArr[0]);
WaitForSingleObject(hThread, INFINITE);
finally
CloseHandle(hThread);
for i:= 0 to StopEventsCount - 1 do CloseHandle(StopArr[i]);
end;
end;
Несколько тестов показали, что возвращается тот, кто "идет первым" в StopArr,
т.е. в нашем случае - Index_CriticalStop.
Вопрос заключается в следующем:
Могу ли я быть уверена, что это всегда будет так ?
Т.е. если CriticalStop поместить в StopArr первым элементом, то я его точно не прозеваю,
не смотря на то, что есть и другие "сработавшие объекты" ?
← →
Сергей М. © (2007-03-01 10:34) [1]
> Могу ли я быть уверена, что это всегда будет так ?
Код, сгенерированный компилятором для CASE-блока, может быть оптимизирован так как компилятор сочтет нужным, поэтому нельзя делать ставку на однозначное соответствие порядка следования вариантов проверок в исх.тексте порядку действительных проверок в результирующем исп.коде
← →
Riply © (2007-03-01 11:00) [2]>[1] Сергей М. © (01.03.07 10:34)
Извини, плохо сформулировала вопрос.
Интересует следущее:
Имеется массив хендов, который передается в MsgWaitForMultipleObjects.
Допустим, к моменту вызова MsgWaitForMultipleObjects, несколько
объектов из этого массива перешли в сигнальное состояние.
Индекс какого из них вернет MsgWaitForMultipleObjects ?
Всегда - ли первого сработавшего, который встретился в массиве
при переборе от 0 до Length(массив) - 1 ?
← →
Сергей М. © (2007-03-01 11:17) [3]
> Riply © (01.03.07 11:00) [2]
Ответ этот вопрос имеется в msdn:
When bWaitAll is FALSE, this function checks the handles in the array in order starting with index 0, until one of the objects is signaled. If multiple objects become signaled, the function returns the index of the first handle in the array whose object was signaled.
← →
Riply © (2007-03-01 12:15) [4]> [3] Сергей М. © (01.03.07 11:17)
Спасибо.
P.S. Плохой из меня сыщик. Ведь, перед тем как спросить,
весь Help излазила :)
← →
Сергей М. © (2007-03-01 12:34) [5]
> Riply © (01.03.07 12:15) [4]
Справка по WinAPI от Борланда по многим причинам изрядно усечена
Возьми себе за полезную привычку при малейших сомнениях искать соотв. инф-цию в msdn - во многих случаях она будет обширнее и точнее.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c