SleepEx

SleepEx,SleepEx函式中止當前執行緒運行直到指定的條件被觸發。當以下任意一點出現時,當前執行緒將恢復運行。

函式原型:

DWORD WINAPI SleepEx(DWORD dwMilliseconds,BOOL bAlertable);

說明:

SleepEx函式中止當前執行緒運行直到指定的條件被觸發。當以下任意一點出現時,當前執行緒將恢復運行。
I/O回調函數被調用
● Asynchronous Procedure Call(APC)異步函式被插入執行緒
● 當前執行緒休眠時間超過最小逾時值

參數說明:

dwMilliseconds
單位毫秒,執行緒休眠的時間。
如果該值設為0,當前執行緒將放棄它剩餘的執行時間片,被將時間片平均分給與它同等級的其它執行緒。如果當前進程沒有與它同等級的執行緒運行,該函式SleepEx立即返回,執行緒繼續執行。
如果INFINITE值被指定,當前執行緒的休眠不會逾時。
bAlertable
如果該參數為FALSE,函式不會返回直到逾時已到。如果一個I/O回調函式出現,該函式也不會返回而且回調函式也不會執行。如果一個APC函式插入執行緒,該函式不會返回而且APC函式也不會執行。
如果該參數為TRUE而且SleepEx與擴展I/O函式(ReadFileEx or WriteFileEx)是在同一個執行緒,函式就會立即返回當執行緒休眠逾時或I/O回調函式出現。如果I/O回調函式出現,那么I/O回調函式會被調用。如果APC被插入執行緒,該函式不論當前執行緒是否逾時都會立即執行,而且APC函式也會被調用。

返回值:

當執行緒休眠逾時函式返回0。
如果函式返是由於I/O回調函式導致,那么返回值是WAIT_IO_COMPLETION,這只會出現在當bAlertable設定TRUE時的情況。

示例:

DWORD WINAPI Reader(PVOID dummy) //執行緒
{
ULONG data;
OVERLAPPED ov;
while(!ExitFlag)
{
ZeroMemory( &ov, sizeof(ov) );
ov.Offset = 0;
ov.OffsetHigh = 0;
if(!ReadFileEx(hDevice, (PVOID)&data, sizeof(ULONG), &ov, CompletionRoutine))
{
printf ( "Error: Read Failed: %d\n", GetLastError());
ExitProcess ( 1 );
}
SleepEx(INFINITE, TRUE);
}
printf("Exiting thread %d \n", GetCurrentThreadId());
ExitThread(0);
return 0;
}
VOID CALLBACK CompletionRoutine( //回調函式
DWORD errorcode,
DWORD bytesTransfered,
LPOVERLAPPED ov
)
{
fprintf(stdout, "Thread %d read: %d bytes\n",
GetCurrentThreadId(), bytesTransfered);
return;
}

相關詞條

相關搜尋

熱門詞條

聯絡我們