Главная страница
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.046 c
15-1172751648
Prohodil Mimo
2007-03-01 15:20
2007.03.25
Есть ли компонент типа TMenu, позволяющий менять фонт?


6-1160254533
H@ns
2006-10-08 00:55
2007.03.25
Маска и широковещательный адрес.


15-1172492815
pavel_guzhanov
2007-02-26 15:26
2007.03.25
Подскажите, в чем может быть проблема?


6-1160139325
urdolphin
2006-10-06 16:55
2007.03.25
Утечка памяти TServerSocket и TClientSocket


2-1172674959
Lonix
2007-02-28 18:02
2007.03.25
Вопрос по SMTP