天天看點

回調函數 句柄 消息 windows的消息機制

  回調函數: 它是這樣一種機制:調用者在初始化一個對象(這裡的對象是泛指,包括OOP中的對象、全局函數等)時,将一些參數傳遞給對象,同時将一個調用者可以通路的函數位址傳遞給該對象(被調用者)。這個函數就是調用者和被調用者之間的一種通知約定,當約定的事件發生時,被調用者(一般會包含一個工作線程)就會按照回調函數位址調用該函數,并向被調用者傳回一個結果。這種方式,調用者在一個線程,被調用者在另一個線程。

  句柄:handle,handle的本意是把柄,把手的意思,就是一個标号。是你與作業系統打交道的東東。舉個通俗的例子,比如你考上了大學,入學後,學校(作業系統)會給你一個學生證号。注意,這個号碼是學校指定的,你無法自選。有了這個号碼(學生證,假設一證多用)就可以享受學校提供的服務:如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂裡買啤酒,因為學校不允許這種服務。而在計算機中系統提供的服務就是API調用,你有了HANDLE,就可以理直氣壯地向系統提出調用API的服務。而指針的權力就大多了,有了指針你可以到處去喝酒,打架,學校(作業系統)管不着,是以句柄和指針的差別在于句柄隻能調用系統提供的服務。而句柄雖然是一個能互相差別的号碼,但與我們普通的ID号又有差別,普通的ID号是可以由程式員自己定義的,而句柄不行,它是對象生成時系統指定的,是為了差別系統中存在的各個對象,這個句柄不是由程式員符給的。實際應用中,最常用的就是檔案句柄和視窗句柄。例如,視窗句柄的值是一個長整數,每個窗體都用一個句柄來表示。是以句柄是不會重複的,很多的函數都會用到窗體的句柄。

  消息:一個消息由一個消息名稱(UINT),和兩個參數(WPARAM,LPARAM)組成。windows的消息機制:消息"是windows運作機制中一個基本而又重要的概念。消息是一個報告事件發生的通知,消息驅動是圍繞消息的産生與處理展開的,并依靠消息循環機制來實作。 某條消息可被視為某個事件的發生,比如點選滑鼠。事件即可以由使用者引發,也可以由應用程式産生,當然windows本身也能發出消息。windows是一個多任務作業系統,是以沒有哪一個程式能夠獨占系統的資源,資源都是由windows統一管理的。那麼某個程式是如何獲得使用者的資訊呢?事實上,windows在時刻監視着使用者的每個舉動,一旦發生了動作,就由windows捕捉而不是應用程式,windows分析該動作與哪一個程式相關,然後将動作以消息的形式發送給目前的應用程式。相反,應用程式也在時時等着消息的到來,一旦發現它的消息隊列中有未處理的資訊,就擷取并分析該消息,并根據消息所包含的内容采取适當的動作來響應,并将結果傳回給系統。 例如視窗程式,當使用者點選按鈕時候,這一動作被windows捕捉,并且以消息(ID和參數)的形式發給該視窗的消息隊列,該視窗發現隊列中有消息,就根據消息調用相應的過程進行處理,并将傳回結果傳回給系統。每個視窗本身都有一個視窗函數,未處理的消息就由它處理,例如拖動。 windows為每個線程維護了相應的消息隊列,應用程式的任務就是不停地從特定的消息隊列中擷取消息、分析消息并處理消息,直到消息(WM_QUIT)為止。這個過程的程式結構稱為"消息循環"。函數回調與消息機制:可以看出,消息機制是一種特殊的函數回調。因為應用程式本是調用系統函數的,但是一旦啟動就等待系統發來的消息,等到消息調用相應過程進行處理,相當于系統進行了回調。是以消息機制是一種廣義的函數回調。

繼續閱讀