WaitForMultipleObjectsEx-Funktion (synchapi.h)

Wartet, bis sich eines oder alle der angegebenen Objekte im signalierten Zustand befinden, eine E/A-Vervollständigungsroutine oder ein asynchroner Prozeduraufruf (APC) in die Warteschlange des Threads eingereiht wird oder das Timeoutintervall verstrichen ist.

Syntax

DWORD WaitForMultipleObjectsEx(
  [in] DWORD        nCount,
  [in] const HANDLE *lpHandles,
  [in] BOOL         bWaitAll,
  [in] DWORD        dwMilliseconds,
  [in] BOOL         bAlertable
);

Parameter

[in] nCount

Die Anzahl der Objekthandles, auf die im Array gewartet werden soll, auf das von lpHandles verwiesen wird. Die maximale Anzahl von Objekthandles ist MAXIMUM_WAIT_OBJECTS. Dieser Parameter darf nicht 0 (null) sein.

[in] lpHandles

Ein Array von Objekthandles. Eine Liste der Objekttypen, deren Handles angegeben werden können, finden Sie im folgenden Abschnitt Hinweise. Das Array kann Handles von Objekten unterschiedlicher Typen enthalten. Es darf nicht mehrere Kopien desselben Handles enthalten.

Wenn eines dieser Handles geschlossen wird, während die Wartezeit noch aussteht, ist das Verhalten der Funktion undefiniert.

Die Handles müssen über das Synchronize-Zugriffsrecht verfügen. Weitere Informationen finden Sie unter Standardzugriffsrechte.

[in] bWaitAll

Wenn dieser Parameter TRUE ist, gibt die Funktion zurück, wenn der Zustand aller Objekte im lpHandles-Array auf signalisiert festgelegt ist. Bei FALSE gibt die Funktion zurück, wenn der Zustand eines der Objekte auf signalisiert festgelegt ist. Im letzteren Fall gibt der Rückgabewert das Objekt an, dessen Zustand die Funktion zurückgegeben hat.

[in] dwMilliseconds

Das Timeoutintervall in Millisekunden. Wenn ein Wert ungleich null angegeben wird, wartet die Funktion, bis die angegebenen Objekte signalisiert werden, eine E/A-Vervollständigungsroutine oder APC in die Warteschlange eingereiht wird oder das Intervall verfällt. Wenn dwMilliseconds null ist, wechselt die Funktion nicht in den Wartezustand, wenn die Kriterien nicht erfüllt sind. es wird immer sofort zurückgegeben. Wenn dwMillisecondsinfinite ist, gibt die Funktion nur zurück, wenn die angegebenen Objekte signalisiert oder eine E/A-Vervollständigungsroutine oder APC in die Warteschlange eingereiht werden.

Windows XP, Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 und Windows Server 2008 R2: Der Wert dwMilliseconds enthält die Zeit, die in Zuständen mit niedriger Energie verbracht wurde. Beispielsweise wird das Timeout während des Ruhezustands des Computers immer wieder heruntergezählt.

Windows 8, Windows Server 2012, Windows 8.1, Windows Server 2012 R2, Windows 10 und Windows Server 2016: Der Wert dwMilliseconds enthält keine Zeit, die mit Zuständen mit niedriger Energie verbracht wurde. Beispielsweise wird das Timeout nicht heruntergezählt, während sich der Computer im Ruhezustand befindet.

[in] bAlertable

Wenn dieser Parameter TRUE ist und sich der Thread im Wartezustand befindet, gibt die Funktion zurück, wenn das System eine E/A-Vervollständigungsroutine oder APC in die Warteschlange stellt und der Thread die Routine oder Funktion ausführt. Andernfalls gibt die Funktion nicht zurück, und die Vervollständigungsroutine oder APC-Funktion wird nicht ausgeführt.

Eine Vervollständigungsroutine wird in die Warteschlange gestellt, wenn die ReadFileEx - oder WriteFileEx-Funktion , in der sie angegeben wurde, abgeschlossen wurde. Die Wait-Funktion gibt zurück, und die Vervollständigungsroutine wird nur aufgerufen, wenn bAlertableTRUE ist und der aufrufende Thread der Thread ist, der den Lese- oder Schreibvorgang initiiert hat. Beim Aufrufen von QueueUserAPC wird ein APC in eine Warteschlange gestellt.

Rückgabewert

Wenn die Funktion erfolgreich ist, gibt der Rückgabewert das Ereignis an, durch das die Funktion zurückgegeben wurde. Dieses Argument einen der folgenden Werte annehmen. (Beachten Sie, dass WAIT_OBJECT_0 als 0 und WAIT_ABANDONED_0 als 0x00000080L definiert ist.)

Rückgabecode/-wert BESCHREIBUNG
WAIT_OBJECT_0 bis (WAIT_OBJECT_0 + nCount– 1)
Wenn bWaitAllTRUE ist, gibt ein Rückgabewert in diesem Bereich an, dass der Zustand aller angegebenen Objekte signalisiert wird.

Wenn bWaitAllAUF FALSE festgelegt ist, gibt der Rückgabewert minus WAIT_OBJECT_0 den lpHandles-Arrayindex des Objekts an, das die Wartezeit erfüllt hat. Wenn während des Aufrufs mehr als ein Objekt signalisiert wurde, ist dies der Arrayindex des signalierten Objekts mit dem kleinsten Indexwert aller signalisierten Objekte.

WAIT_ABANDONED_0 bis (WAIT_ABANDONED_0 + nCount– 1)
Wenn bWaitAllTRUE ist, gibt ein Rückgabewert in diesem Bereich an, dass der Zustand aller angegebenen Objekte signalisiert wird, und mindestens eines der Objekte ist ein verlassenes Mutex-Objekt.

Wenn bWaitAllFALSE ist, gibt der Rückgabewert minus WAIT_ABANDONED_0 den lpHandles-Arrayindex eines verlassenen Mutex-Objekts an, das die Wartezeit erfüllt hat. Der Besitz des Mutex-Objekts wird dem aufrufenden Thread gewährt, und der Mutex wird auf nicht signalisiert festgelegt.

Wenn ein Mutex Informationen zum beständigen Zustand schützt, sollten Sie ihn auf Konsistenz überprüfen.

WAIT_IO_COMPLETION
0x000000C0L
Die Wartezeit wurde durch einen oder mehrere asynchrone Prozeduraufrufe (APC ) im Benutzermodus beendet, die im Thread in die Warteschlange eingereiht wurden.
WAIT_TIMEOUT
0x00000102L
Das Timeoutintervall ist abgelaufen, die vom bWaitAll-Parameter angegebenen Bedingungen wurden nicht erfüllt, und es werden keine Abschlussroutinen in die Warteschlange eingereiht.
WAIT_FAILED
(DWORD)0xFFFFFFFF
Die Funktion ist fehlgeschlagen. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Hinweise

Die WaitForMultipleObjectsEx-Funktion bestimmt, ob die Wartekriterien erfüllt wurden. Wenn die Kriterien nicht erfüllt wurden, wechselt der aufrufende Thread in den Wartezustand, bis die Bedingungen der Wartekriterien erfüllt sind oder das Timeoutintervall verstrichen ist.

Wenn bWaitAllAUF TRUE festgelegt ist, wird der Wartevorgang der Funktion nur abgeschlossen, wenn der Status aller Objekte auf signalisiert festgelegt wurde. Die Funktion ändert die Zustände der angegebenen Objekte erst, wenn der Status aller Objekte auf signalisiert festgelegt wurde. Beispielsweise kann ein Mutex signalisiert werden, aber der Thread erhält erst dann den Besitz, wenn der Status der anderen Objekte ebenfalls auf signalisiert festgelegt ist. In der Zwischenzeit kann ein anderer Thread den Besitz des Mutex erhalten, wodurch sein Zustand auf nicht signalisiert festgelegt wird.

Wenn bWaitAllauf FALSE festgelegt ist, überprüft diese Funktion die Handles im Array, beginnend mit Index 0, bis eines der Objekte signalisiert wird. Wenn mehrere Objekte signalisiert werden, gibt die Funktion den Index des ersten Handles in dem Array zurück, dessen Objekt signalisiert wurde.

Die -Funktion ändert den Zustand einiger Typen von Synchronisierungsobjekten. Die Änderung erfolgt nur für das Objekt oder die Objekte, deren signalisierter Zustand dazu geführt hat, dass die Funktion zurückgegeben wurde. Beispielsweise wird die Anzahl eines Semaphorobjekts um eins verringert. Weitere Informationen finden Sie in der Dokumentation zu den einzelnen Synchronisierungsobjekten.

Um auf mehr als MAXIMUM_WAIT_OBJECTS Handles zu warten, verwenden Sie eine der folgenden Methoden:

  • Erstellen Sie einen Thread, der auf MAXIMUM_WAIT_OBJECTS Handles wartet, und warten Sie dann auf diesen Thread und die anderen Handles. Verwenden Sie diese Technik, um die Handles in Gruppen von MAXIMUM_WAIT_OBJECTS aufzuteilen.
  • Rufen Sie RegisterWaitForSingleObject oder SetThreadpoolWait auf, um auf jedes Handle zu warten. Der Threadpool wartet effizient auf die Handles und weist einen Workerthread zu, nachdem das Objekt signalisiert wurde oder das Timeoutintervall abläuft.
Die WaitForMultipleObjectsEx-Funktion kann Handles eines der folgenden Objekttypen im lpHandles-Array angeben:
  • Änderungsbenachrichtigung
  • Konsoleneingabe
  • Ereignis
  • Benachrichtigung zur Speicherressource
  • Mutex
  • Prozess
  • Semaphore
  • Thread
  • Wartebarer Timer
Gehen Sie vorsichtig vor, wenn Sie die Wartefunktionen und den Code aufrufen, der direkt oder indirekt Fenster erstellt. Wenn ein Thread Fenster erstellt, muss er Meldungen verarbeiten. Nachrichtenübertragungen werden an alle Fenster im System gesendet. Ein Thread, der eine Wartefunktion ohne Timeoutintervall verwendet, kann dazu führen, dass das System zu einem Deadlock wird. Zwei Beispiele für Code, der indirekt Fenster erstellt, sind DDE und die CoInitialize-Funktion . Wenn Sie also über einen Thread verfügen, der Fenster erstellt, verwenden Sie MsgWaitForMultipleObjects oder MsgWaitForMultipleObjectsEx anstelle von WaitForMultipleObjectsEx.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile synchapi.h (enthalten Windows.h unter Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Bibliothek Kernel32.lib
DLL Kernel32.dll

Siehe auch

Synchronisierungsfunktionen

Wait-Funktionen