2012-03-19 14 views
6

Mam pętlę zdarzeń, która czeka na kilka zdarzeń automatycznego resetowania. Wszystkie zdarzenia zostały zainicjowane w tablicy eventHandles_ z CreateEvent(NULL, false, false, NULL).Czy funkcja WaitForMultipleObjects() resetuje wszystkie zdarzenia automatycznego resetowania?

while (true) 
{ 
    DWORD waitResult = WaitForMultipleObjects(3, eventHandles_, false, INFINITE); 
    switch (waitResult) 
    { 
    case WAIT_OBJECT_0 + 0: 
     //handle event... 

    case WAIT_OBJECT_0 + 1: 
     //handle event... 

    case WAIT_OBJECT_0 + 2: 
     //handle event... 
    } 
} 

Moje pytanie: czy zdarzenie 1 i 2 występują jednocześnie, pętla będzie przetwarzać WAIT_OBJECT_0 + 1 bo to pierwszy. Ale czy zdarzenie 2 pozostanie zasygnalizowane, gdy pętla znów się pojawi? Czy to się automatycznie resetuje?

+1

Ogólnie rzecz biorąc, najlepiej jest unikać takich konstrukcji. Chciałbym, aby każdy wątek sygnalizacyjny naciskał odpowiedni indeks, delegat lub cokolwiek na kolejkę wątkową i sygnalizował pojedynczy semafor. Projektuje wokół problemu - zachowanie jest całkowicie znane i przewidywalne, żadne zdarzenia nigdy nie zostaną utracone, nawet jeśli jeden wątek sygnalizuje więcej niż jeden raz, nie ma ograniczenia dotyczącego 64-uchwytów, a liczba sygnalizatorów nie jest ustalona podczas kompilacji. –

Odpowiedz

5

„... modyfikacja pojawia się tylko dla obiektu lub obiektów, których sygnalizowany stan spowodowany funkcję powrotu ...”

http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx

A z ust jednego Raymond Chen:

W przypadku oczekiwania na jedno wydarzenie, modyfikowane jest tylko to wydarzenie. Jeśli oczekujesz na wszystkie zdarzenia, wszystkie zostaną zmodyfikowane. Taka dokumentacja oznacza "obiekt lub obiekty". Liczba pojedyncza, jeśli oczekiwana, dowolna, liczba mnoga, jeśli wait-all.

Powiązane problemy