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

Вниз

Индекс объекта, возвращаемого 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;

И тестируем какой из "сработавших объектов" нам вернет MsgWaitForMultipleObjects
procedure 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
15-1172600124
Kerk
2007-02-27 21:15
2007.03.25
За что я люблю Perl


2-1172838130
kester
2007-03-02 15:22
2007.03.25
DBListBox


2-1172685152
aha
2007-02-28 20:52
2007.03.25
Как можно изменить mainmenu - предположим есть два варианта


15-1172632302
Slider007
2007-02-28 06:11
2007.03.25
С днем рождения ! 28 февраля


15-1172574124
DrDe
2007-02-27 14:02
2007.03.25
Delphi7, компи.....