SleepEx-Funktion (synchapi.h)
Hält den aktuellen Thread an, bis die angegebene Bedingung erfüllt ist. Die Ausführung wird fortgesetzt, wenn einer der folgenden Schritte auftritt:
- Eine E/A-Vervollständigungsrückruffunktion wird aufgerufen.
- Ein asynchroner Prozeduraufruf (APC) wird in die Warteschlange des Threads eingereiht.
- Das Timeoutintervall verfällt.
Syntax
DWORD SleepEx(
[in] DWORD dwMilliseconds,
[in] BOOL bAlertable
);
Parameter
[in] dwMilliseconds
Das Zeitintervall, für das die Ausführung angehalten werden soll( in Millisekunden).
Der Wert 0 (null) bewirkt, dass der Thread den Rest seines Zeitslices an jeden anderen Thread übergibt, der ausgeführt werden kann. Wenn keine anderen Threads ausgeführt werden können, wird die Funktion sofort zurückgegeben, und der Thread setzt die Ausführung fort. Windows XP: Der Wert 0 (null) bewirkt, dass der Thread den Rest seines Zeitslices an einen anderen Thread mit gleicher Priorität übergibt, der zur Ausführung bereit ist. Wenn keine anderen Threads mit gleicher Priorität ausgeführt werden können, wird die Funktion sofort zurückgegeben, und der Thread setzt die Ausführung fort. Dieses Verhalten hat sich ab Windows Server 2003 geändert.
Der Wert INFINITE gibt an, dass für die Unterbrechung kein Timeout ausgeführt werden soll.
[in] bAlertable
Wenn dieser Parameter FALSE ist, wird die Funktion erst zurückgegeben, wenn der Timeoutzeitraum abgelaufen ist. Wenn ein E/A-Vervollständigungsrückruf erfolgt, wird die Funktion nicht sofort zurückgegeben, und die E/A-Vervollständigungsfunktion wird nicht ausgeführt. Wenn ein APC im Thread in die Warteschlange eingereiht wird, wird die Funktion nicht sofort zurückgegeben, und die APC-Funktion wird nicht ausgeführt.
Wenn der Parameter TRUE ist und der Thread, der diese Funktion aufgerufen hat, derselbe Thread ist, der die erweiterte E/A-Funktion (ReadFileEx oder WriteFileEx) aufgerufen hat, gibt die Funktion zurück, wenn entweder der Timeoutzeitraum abgelaufen ist oder wenn eine E/A-Vervollständigungsrückruffunktion auftritt. Wenn ein E/A-Abschlussrückruf erfolgt, wird die E/A-Vervollständigungsfunktion aufgerufen. Wenn ein APC im Thread (QueueUserAPC) in die Warteschlange eingereiht wird, gibt die Funktion zurück, wenn der Timeoutzeitraum abgelaufen ist oder wenn die APC-Funktion aufgerufen wird.
Rückgabewert
Der Rückgabewert ist null, wenn das angegebene Zeitintervall abgelaufen ist.
Der Rückgabewert wird WAIT_IO_COMPLETION , wenn die Funktion aufgrund einer oder mehrerer E/A-Vervollständigungsrückruffunktionen zurückgegeben wird. Dies kann nur geschehen, wenn bAlertable TRUE ist und wenn der Thread, der die SleepEx-Funktion aufgerufen hat, derselbe Thread ist, der die erweiterte E/A-Funktion aufgerufen hat.
Hinweise
Diese Funktion bewirkt, dass ein Thread den Rest seines Zeitsegments aufgibt und für ein Intervall nicht ausgeführt werden kann, das auf dem Wert von dwMilliseconds basiert. Nachdem das Standbyintervall abgelaufen ist, kann der Thread ausgeführt werden. Beachten Sie, dass ein bereiter Thread nicht garantiert sofort ausgeführt wird. Folglich wird der Thread erst nach Ablauf des Standbyintervalls ausgeführt, basierend auf der "Tick"-Häufigkeit des Systems und dem Auslastungsfaktor anderer Prozesse. Die Systemuhr "tickt" mit einer konstanten Rate. Um die Genauigkeit des Standbyintervalls zu erhöhen, rufen Sie die timeGetDevCaps-Funktion auf, um die unterstützte minimale Timerauflösung zu bestimmen, und die timeBeginPeriod-Funktion , um die Timerauflösung auf ihr Minimum festzulegen. Gehen Sie beim Aufrufen von timeBeginPeriod vorsichtig vor, da sich häufige Anrufe erheblich auf die Systemuhr, die Systemenergienutzung und den Scheduler auswirken können. Wenn Sie timeBeginPeriod aufrufen, rufen Sie es einmal früh in der Anwendung auf, und achten Sie darauf, dass Sie die timeEndPeriod-Funktion ganz am Ende der Anwendung aufrufen. Wenn Sie 0 Millisekunden angeben, gibt der Thread den Rest seines Zeitsegments auf, bleibt aber bereit. Weitere Informationen finden Sie unter Planungsprioritäten.
Diese Funktion kann mit den Funktionen ReadFileEx oder WriteFileEx verwendet werden, um einen Thread anzusetzen, bis ein E/A-Vorgang abgeschlossen ist. Diese Funktionen geben eine Vervollständigungsroutine an, die nach Abschluss des E/A-Vorgangs ausgeführt werden soll. Damit die Vervollständigungsroutine ausgeführt werden kann, muss sich der Thread, der die E/A-Funktion aufgerufen hat, in einem warnbaren Wartezustand befinden, wenn die Abschlussrückruffunktion auftritt. Ein Thread wechselt in einen warnbaren Wartezustand, indem entweder SleepEx, MsgWaitForMultipleObjectsEx, WaitForSingleObjectEx oder WaitForMultipleObjectsEx aufgerufen wird, wobei der bAlertable-Parameter der Funktion auf TRUE festgelegt ist.
Seien Sie vorsichtig, wenn Sie SleepEx in den folgenden Szenarien verwenden:
- Code, der direkt oder indirekt Fenster erstellt (z. B. DDE und COM CoInitialize). Wenn ein Thread Fenster erstellt, muss er Meldungen verarbeiten. Nachrichtenübertragungen werden an alle Fenster im System gesendet. Wenn Sie über einen Thread verfügen, der SleepEx mit unendlicher Verzögerung verwendet, wird das System deadlockt.
- Threads, die unter Parallelitätssteuerung stehen. Beispielsweise beschränkt ein E/A-Vervollständigungsport oder Threadpool die Anzahl der zugeordneten Threads, die ausgeführt werden können. Wenn die maximale Anzahl von Threads bereits ausgeführt wird, kann kein zusätzlicher zugeordneter Thread ausgeführt werden, bis ein ausgeführter Thread abgeschlossen ist. Wenn ein Thread SleepEx mit einem Intervall von 0 (null) verwendet, um auf einen der zusätzlichen zugeordneten Threads zu warten, um einige Arbeit zu erledigen, kann der Prozess zu einem Deadlock führen.
Windows Phone 8.1: Diese Funktion wird für Windows Phone Store-Apps ab Windows Phone 8.1 unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
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 (einschließlich Windows.h unter Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Bibliothek | Kernel32.lib; WindowsPhoneCore.lib auf Windows Phone 8.1 |
DLL | KernelBase.dll am Windows Phone 8.1; Kernel32.dll |