一、waitforsingleobject時間
waitforsingleobject是Windows API中一種同步機制,其作用是等待一個關鍵對象的信號,或者等待某個時間間隔,以等待被通知、滿足條件或者時間到達等情況發生。在使用waitforsingleobject時,可以通過參數timeout來設置等待的時間。如果在timeout時間內對象被釋放,則該函數會返回WAIT_OBJECT_0,如果timeout時間內對象仍未被釋放,則返回WAIT_TIMEOUT。
waitforsingleobject函數有一個非常棒的特性,它可以將調用的線程掛起,直到對象變成可以用。如果將timeout值設為0,那麼 waitforsingleobject將會對對象的狀態進行查詢,如果處於可用狀態,該函數會立即返回;否則,該函數會將線程掛起到對象變為可用。
DWORD WaitForSingleObject( HANDLE hHandle, // 要等待的對象的句柄 DWORD dwMilliseconds // 等待的時間,以毫秒為單位。設置為INFINITE表示等待無限長的時間。 );
二、waitforsingleobject返回1
waitforsingleobject函數返回值1代表WAIT_FAILED,這意味着這次等待沒有成功。其中一種可能的情況是傳入了一個無效的句柄。此外,WAIT_FAILED可能是因為內部錯誤導致的,這種情況可能需要進一步的調查和排除。
為了幫助你提高代碼的魯棒性,可以將參數hHandle傳入WAIT_OBJECT_0_INTERNAL,這樣函數將會返回0,代表成功等待,或者返回WAIT_TIMEOUT。
#define WAIT_OBJECT_0_INTERNAL ((DWORD)0x00000001L) HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); DWORD dwWaitResult = WaitForSingleObject(hEvent, INFINITE); if (dwWaitResult == WAIT_FAILED) { // handle wait failed. }
三、waitforsingleobject和sleep
waitforsingleobject和sleep都是Windows API中的同步機制,它們都可以用來等待一些事件的發生。但是,waitforsingleobject有一個非常明顯的優點:它可以接收Windows內核對象的句柄作為參數。因此,在處理文件、進程、線程等資源時,waitforsingleobject至關重要。
相比之下,sleep函數一般用於「暫停」程序的執行,僅當你希望暫時停止程序時才應該使用。但是,如果需要等待某個資源釋放,sleep函數則是不適宜的。
由於waitforsingleobject可以接收的對象較多,因此waitforsingleobject可以用於任何需要等待對象的應用程序中。
HANDLE hFile = CreateFile("test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { WaitForSingleObject(hFile, INFINITE); //... CloseHandle(hFile); } else { // handle file creation failed. }
四、waitforsingleobject的作用qt
在Qt中,waitforsingleobject可以用來等待信號的觸發。QEventLoop藉助waitforsingleobject等待任意時間間隔,直到接收到一個觸發某個事件的信號。
void MyObject::someLongRunningFunction() { //... QEventLoop waitLoop; connect(this, &MyObject::someSignal, &waitLoop, &QEventLoop::quit); connect(this, &MyObject::someTimeoutSignal, &waitLoop, &QEventLoop::quit); QTimer::singleShot(5000, this, &MyObject::someTimeoutSignal); waitLoop.exec(); //... }
五、waitforsingleobject在switch中
在一些特定的編程場景中,很常見的一種操作是使用switch語句來處理不同的Windows消息。此時,waitforsingleobject函數可以用來等待UserModeConsoleInput事件或用戶輸入事件等。
藉助waitforsingleobject來等待這些事件,可以減輕程序的負擔,同時還能簡化程序的結構。
DWORD ConsoleInputLoop() { while (true) { DWORD dwWaitResult = WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE); if (dwWaitResult == WAIT_OBJECT_0) { //process console input INPUT_RECORD irInBuf[128]; DWORD dwNumRead; if (ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), irInBuf, 128, &dwNumRead)) { //... } else { break; } } // handle wait result switch (dwWaitResult) { case WAIT_OBJECT_0 + 1: //... break; case WAIT_OBJECT_0 + 2: //... break; case WAIT_OBJECT_0 + 3: //... break; default: break; } } }
六、waitforsingleobject卡頓
正常情況下,waitforsingleobject應該是一個非常高效的API。但是,在某些情況下,waitforsingleobject會出現阻塞、死鎖等問題。這種情況下通常是因為等待的對象沒有被正確釋放或其狀態不正確而導致的。
為了避免waitforsingleobject的卡頓,可以嘗試使用WaitForMultipleObjects,減少waitforsingleobject的調用次數,並確保在使用waitforsingleobject時對象的狀態都是正確的。
HANDLE hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL); HANDLE hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL); HANDLE hEvents[2] = {hEvent1, hEvent2}; WaitForMultipleObjects(2, hEvents, TRUE, INFINITE); //...
結語
waitforsingleobject是Windows API中重要的同步機制之一,它可以用來等待關鍵對象的信號、資源的釋放或其他指定的事件。waitforsingleobject的使用不僅可以提高程序的效率,還可以簡化程序的結構和設計。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/242992.html