共找到3條詞條名為handle的結果 展開

handle

Windows操作系統中的一個概念

HANDLE:句柄,是Windows用來表示對象的(不是C++的對象),HWND是其中一種,HWND是HANDLE,但HANDLE不只是HWND,HANDLE是一個通用句柄表示,HWND是一個專用表示窗口的句柄。更具體的可查找MSDN。包含在winnt.h頭文件中。

基本介紹


HANDLE(句柄)是Windows操作系統中的一個概念。在Windows程序中,有各種各樣的資源(窗口、圖標、游標等),系統在創建這些資源時會為它們分配內存,並返回標示這些資源的標示號,即句柄。句柄指的是一個核心對象在某一個進程中的唯一索引,而不是指針。由於地址空間的限制,句柄所標識的內容對進程是不可見的,只能由操作系統通過進程句柄列表來進行維護。句柄列表:每個進程都要創建一個句柄列表,這些句柄指向各種系統資源,比如信號量,線程,和文件等,進程中的所有線程都可以訪問這些資源。
無效的返回值為:INVALID_HANDLE_VALUE
在windows程序中,有各種各樣的資源(窗口、圖標、游標等),系統在創建這些資源時會為他們分配內存,並返回標示這些資源的標示號,即句柄 。
句柄指的是一個核心對象在某一個進程中的唯一索引,而不是指針。
其實我們編程時輸出一下句柄的值就可以發現這些值往往非常小(<100)。由此就可以看出句柄的性質了。
無效的返回值為: INVALID_HANDLE_VALUE
編程時可作調試用:
HANDLE:句柄,是windows用來表示對象的(不是C++的對象),HWND是其中一種。
HANDLE是一個通用句柄表示,HWND是一個專用表示窗口的句柄。
CreateThread
Windows API函數,該函數再主線程的基礎上創建一個新線程。
WaitForMultipleObjects
WaitForMultipleObjects:幾乎可以等待Windows中的所有的內核對象。
原型:
1DWORD WaitForMultipleObjects(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);
WaitForSingleObject的返回值能夠指明調用線程為什麼再次變為可調度狀態。如果線程等待的對象變為已通知狀態,那麼返回值是 WAIT_OBJECT_0。如果設置的超時已經到期,則返回值是WAIT_TIMEOUT。如果將一個錯誤的值(如一個無效句柄)傳遞給 WaitForSingleObject,那麼返回值將是WAIT_FAILED(若要了解詳細信息,可調用GetLastError)
nCount參數用於指明想要讓函數查看的內核對象的數量。這個值必須在1與MAXIMUM_WAIT_OBJECTS(在Windows頭文件中定義為64)之間。lpHandles參數是指向內核對象句柄的數組的指針。
可以以兩種不同的方式來使用WaitForMultipleObjects函數:
一種方式是讓線程進入等待狀態,直到指定內核對象中的任何一個變為已通知狀態。
另一種方式是讓線程進入等待狀態,直到所有指定的內核對象都變為已通知狀態。bWaitAll參數告訴該函數,你想要讓它使用何種方式。如果為該參數傳遞TRUE,那麼在所有對象變為已通知狀態之前,該函數將不允許調用線程運行。
WaitForMultipleObjects函數的返回值告訴調用線程,為 什麼它會被重新調度。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,這兩個值的作用是很清楚的。如果fWaitAll參數傳遞 TRUE,同時所有對象均變為已通知狀態,那麼返回值是WAIT_OBJECT_0。
如果為fWaitAll傳遞FALSE,那麼一旦任何一個對象變為已 通知狀態,該函數便返回。在這種情況下,你可能想要知道哪個對象變為已通知狀態。返回值是WAIT_OBJECT_0 與(WAIT_OBJECT_0 +dwCount-1)之間的一個值。換句話說,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那麼應該從返回值中減去 WAIT_OBJECT_0。產生的數字是作為第二個參數傳遞給WaitForMultipleObjects的句柄數組中的索引。該索引說明哪個對象變 為已通知狀態。
dwMilliseconds參數的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函數無論如何都會返回。同樣,通常為該參數傳遞INFINITE,但是在編寫代碼時應該小心,以避免出現死鎖情況。
WaitForSingleObject
1DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
有兩個參數,分別是THandle和Timeout(毫秒單位),hHandle是一個事件的句柄,第二個參數dwMilliseconds是時間間隔。
WaitForSingleObject函數用來檢測hHandle事件的信號狀態,當函數的執行時間超過dwMilliseconds就返回,但如果參數dwMilliseconds為INFINITE時函數將直到相應時間事件變成有信號狀態才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執行後面的代碼
它可以等待如下幾種類型的對象:
Event,Mutex,Semaphore,Process,Thread
有三種返回類型:
WAIT_OBJECT_0, 表示等待的對象有信號(對線程來說,表示執行結束);
WAIT_TIMEOUT, 表示等待指定時間內,對象一直沒有信號(線程沒執行完);
WAIT_ABANDONED 表示對象有信號,但還是不能執行 一般是因為未獲取到鎖或其他原因
CreateMutex
作用是找出當前系統是否存在指定進程的實例。如果沒有則創建一個互斥體。
CreateMutex()函數可用來創建一個有名或無名的互斥量對象,其函數原型為:
1
2
3
4
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全屬性的指針
BOOL bInitialOwner, // 初始化互斥對象的所有者
LPCTSTR lpName // 指向互斥對象名的指針
);
如果函數成功執行,將返回一個互斥量對象的句柄。如果在CreateMutex()執行前已經存在有相同名字的互斥量,函數將返回這個已經存在互斥量的句柄,並且可以通過GetLastError()得到錯誤代碼ERROR_ALREADY_EXIST。可見,通過對錯誤代碼ERROR_ALREADY_EXIST的檢測可以實現CreateMutex()對進程的互斥。
建立互斥體,用來同步。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。
C++與HWND
在窗口對象是一個對象的C++CWnd類(或派生的類)的應用程序直接創建。它出現,並轉到應用程序的構造函數和析構函數調用的響應中。Windows窗口后,就是內部Windows數據結構,它對應的窗口,並會佔用系統資源時存在一個不透明句柄。Windows窗口由"窗口句柄"(HWND),並創建后CWnd對象創建通過調用Create類的成員函數CWnd。通過程序調用或用戶的操作,可能會銷毀窗口。窗口對象中存儲的窗口句柄m_hWnd成員變數。下圖顯示了之間的關係C++窗口對象和Windows窗口。在討論創建windows創建Windows。中介紹了銷毀窗口銷毀窗口對象。
handle與HWND
HWND一般是用來定義窗口句柄的。HANDLE是用來定義任何類型的句柄,(Handletoanobject).包括HWND。可以理解為HWND是HANDLE的一個特例,用來表示一個窗口。
無效的返回值為: INVALID_HANDLE_VALUE