SleepEx

ŁF
// C
DWORD SleepEx(
  DWORD dwMilliseconds,
  BOOL bAlertable
);
// Delphi
function SleepEx(dwMilliseconds:DWORD;bAlertable:BOOL):DWORD; stdcall;

Funkcja SleepEx wstrzymuje działanie wątku, który ją wywołał, do momentu kiedy nie nastąpi jedno z poniższych zdarzeń:

  • zostanie wywołana funkcja obsługi I/O
  • APC (Asynchronous Procedure Call) zostanie zakolejkowane do obsługi przez wątek
  • zostanie osiągnięty minimalny timeout
    Parametry:
    dwMilliseconds
    Czas w milisekundach na który wątek zostanie uśpiony, o ile nie nastąpi jedno z opisanych powyżej zdarzeń. Jeśli podana wartość to 0, wątek oddaje swój kwant czasu procesora i sterowanie wędruje do innego wątku; jeśli nie ma innego wątku, któremu można przydzielić czas procesora, funkcja natychmiast kończy swoje działanie i zwraca wykonywanie do wątku, który ją wywołał.
    Podanie wartości INFINITE oznacza, że funkcja Sleep nigdy nie zakończy swojego działania.

bAlertable
Jeśli parametr ten ma wartość false, funkcja SleepEx zachowuje się jak funkcja Sleep. Procedury obsługi I/O ani APC nie zostaną wykonane, dopóki nie upłynie żądany okres czasu.
Jeśli parametr ten przyjmuje wartość true i wątek który wywołał SleepEx jest tym samym wątkiem, który wywołał funkcję rozszerzonego I/O (ReadFileEx lub WriteFileEx), funkcja SleepEx zakończy działanie po upływie żadanego czasu lub gdy zostanie wywołana funkcja obsługi I/O.
Podobnie z APC.

Zwracana wartość
Funkcja zwraca 0, jeśli upłynął żądany czas, lub WAIT_IO_COMPLETION jeśli oczekiwanie zostało przerwane przez wywołanie funkcji obsługi I/O.

Uwagi
Funkcja SleepEx nie gwarantuje powrotu do wątku dokładnie po podanym czasie - może być on dłuższy, w zależności od tego ile w danej chwili wątków w systemie pracuje na tym samym bądź wyższym priorytecie.
Funkcja ta może zostać użyta do obsługi funkcji ReadFileEx i WriteFileEx, aby zawiesić wątek do czasu ukończenia operacji I/O.
Ponadto trzeba pamiętać, że użycie SleepEx w wątku, który stworzył okno i zajmuje się obsługą jego kolejki komunikatów, spowoduje zawieszenie obsługi komunikatów. Z tego powodu należy unikać używania tej funkcji w głównym wątku. Zamiast niej należy użyć MsgWaitForMultipleObjects lub MsgWaitForMultipleObjectsEx.

Zobacz też:

0 komentarzy