Given: ja wypełnić tablicę z uchwytów samochodowych imprez Reset i przekazać go do WaitForMultipleObjects z bWaitAll = False.Zachowanie WaitForMultipleObjects gdy wiele uchwyty sygnalizują jednocześnie
Od MSDN: "Gdy bWaitAll jest FALSE, ta funkcja sprawdza uchwyty w tablicy począwszy od indeksu 0, aż jeden z obiektów zostanie zasygnalizowany. Jeśli zostanie zasygnalizowanych wiele obiektów, funkcja zwróci indeks pierwszego uchwytu w tablicy, której obiekt został zasygnalizowany. "
Teraz, jeśli sygnał wielu obiektów otrzymam indeks pierwszego. Czy muszę pętli przez moją tablicę, aby sprawdzić, czy inni sygnalizowali?
Teraz mam pętlę, która znajduje się wzdłuż linii:
For (; ;)
{
WaitForMultipleObjects(…)
If (not failed)
Process object that called.
Remove the handle that signaled from the array.
Compact the arrary.
}
To jest efektywnie używane rozwiązanie. Klucz, który musiałem wymyślić, brzmiał: "jeśli wiele obiektów zostanie zasygnalizowanych, nadal będą sygnalizowane, kiedy wrócisz". Jeśli nie muszę się martwić o głód, moje oryginalne rozwiązanie było w porządku. – Chris
Tak. WaitForMultipleObjects() skanuje tablicę uchwytów od 0 i zwraca, gdy tylko znajdzie zasygnalizowany uchwyt. Tylko ten pierwszy znaleziony uchwyt jest resetowany do stanu nie sygnalizowanego; pozostałe są nietknięte. –