深入解析waitforsingleobject

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:53
下一篇 2024-12-12 12:53

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25

發表回復

登錄後才能評論