在MFC應用框架下執行狀態機

2021-06-15 18:56:19 字數 2474 閱讀 7992

本文描述了使用鉤子技術在基於

windows

程式的mfc

應用框架下直接執行狀態機應用程式的方法。

乙個典型的狀態自動機執行緒如下運作:

smerun()

else break;

} while(1);

}這種執行模式的缺點是我們必須為狀態自動機建立乙個單獨的執行緒。為了直接用基於程式的

mfc應用框架

執行狀態自動機應用程式,狀態嚮導允許你使用

函式mfchookwnd().

將乙個應用執行緒與乙個

視窗相連。

mfc程式可以將乙個外部事件

傳遞或傳送到執行在乙個執行緒上的

被鉤住的

視窗,然後引擎

將它分發到活動的狀態機應用程式。

mfchookwnd()

通過在windows

下把乙個

hwnd

物件作為子類鉤住這個

hwnd

物件,即通過在所有當前的程式前面插入它自己的視窗程序,通常是

afxwndproc

。可以參考

microsoft systems journal

(march 1997

)獲得更詳細的資訊。

lresult cegnsubclasswnd::windowproc(hwnd hwnd, uint msg, wparam wp,lparam lp)

ret = csubclasswnd::windowproc(hwnd,msg,wp,lp);

return ret;

}cegnsubclasswnd engsubclasswnd;

bool mfchookwnd(hwnd hwndhooked)

通常,所有的狀態機程式只執行在乙個執行緒上。然而,狀態自動機允許將程式分成一些組,每組的程式同時在單獨的執行緒上執行。如下圖:用

mfc圖:

用mfc

執行狀態自動機

下面的例子說明了鉤住對話方塊訊息和分發外部事件給

player

狀態機應用程式的方法。宣告乙個應用執行緒上下文。在對話方塊

開啟時,通過

smeinitengine()

初始化狀態自動機的執行緒上下文。在

windows

系統下,這個函式將自動的隱式的初始化所給執行緒上下文的以下資訊:

1) smesetexteventoprproc()

通過windows api getmessage(), postthreadmessage()

來建立外部事件處理函式

。2) smesetmemoprproc()

通過new, delete

操作來建立動態記憶體管理函式。

3) smesettlsproc()

通過windows api tlsgetvalue(), tlssetvalue()

來建立執行緒區域性儲存器程式函式。

然後鉤住

對話方塊訊息。啟用

player

應用程式的應用執行緒。如果有外部事件觸發,呼叫

mfcpostextinteventtownd()

函式傳送乙個外部事件給

對話方塊。這個函式將傳送如下的

wm_ext_evnet_id

視窗訊息給

對話方塊。

#define wm_ext_event_id(0xbfff)

當狀態自動機接收到這個訊息,將資訊轉化為乙個外部事件,如果它不是空的就

將它分發到目的應用程式埠;否則將它分發到所有在應用執行緒上下文上的活動應用程式。

圖: player

應用程式

bool csampleplayermfcdlg::oninitdialog()

void csampleplayermfcdlg::onbuttonpower()

void csampleplayermfcdlg::onbuttonpause()

被鉤住的視窗毀滅時,視窗訊息鉤子被自動

的移除。

下面的函式對

windows

應用程式的發展起了很大作用。

·mfchookwnd()

: 這個

api

函式鉤住特定的視窗。

·mfcpostextptreventtownd()

: 這個

api

函式傳遞

mfcpostextinteventtownd()

: 這個

api函式傳送

·mfcsendextptreventtownd()

:這個api函式

傳遞乙個帶有兩個整型引數的外部事件給特定的視窗,然後引擎

分發 ·

mfcsendextinteventtownd()

: 這個api函式傳送乙個帶有兩個整型引數的外部 事件給特定的視窗,然後引擎

分發

www.intelliwizard.com

MFC執行框架

2 winmain登場 extern c int winapi twinmain hinstance hinstance,hinstance hprevinstance,lptstr lpcmdline,int ncmdshow twinmain函式的 t 是為了支援unicode而準備的乙個巨集。...

基於MFC框架下OpenGL的exe可移植

以前寫了幾個mfc框架下的opengl小專案,但是移植exe的時候總需要copy很多dll檔案,感覺太low,於是今天就抽時間解決了這個問題。我們了解一下關於mfc的兩個執行機制 一 mfc庫鏈結方式 1 靜態連線 把需要的mfc庫函式放進你的exe之中,這樣,在mfc庫函式檔案不在的情況下,你的e...

Scrapy爬蟲框架下執行爬蟲的方法

在使用scrapy框架進行爬蟲時,執行爬蟲檔案的方法是 scrapy crawl 其中 是爬蟲檔名。但是,當我們在建立了多個檔案時,使用上面的命令時會比較繁瑣麻煩,我們就可以使用下述方法同時完成爬蟲檔案的執行。第一種,在scrapy框架下建立乙個執行檔案,如 run.py 在檔案中建立乙個列表,列表...