Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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;

И тестируем какой из "сработавших объектов" нам вернет 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.042 c
15-1172679850
Calibr
2007-02-28 19:24
2007.03.25
Кнопка в Проводнике


1-1170488282
TCrash
2007-02-03 10:38
2007.03.25
Сервисы NT


4-1161174024
BiN
2006-10-18 16:20
2007.03.25
Перечисление системных объектных типов


15-1172662527
ocean
2007-02-28 14:35
2007.03.25
Проблема с сетью


2-1173107320
bagos
2007-03-05 18:08
2007.03.25
использование Access





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский