MFC 利用執行緒更新介面

2021-09-02 05:26:57 字數 2177 閱讀 2212

非常感謝@baiyin 的文章

mfc在其他執行緒中重新整理主對話方塊中edit等控制項資料

正在進行的專案中,要在新開啟的執行緒中處理資料,並把資料的處理結果在介面控制項中更新,所以需要使資料處理執行緒傳送訊息給介面,下面是乙個小例子:

1、在mfc的對話方塊中,新增乙個文字編輯框控制項(edit control)控制項,修改其id為idc_edit_data

2、右鍵文字編輯框控制項idc_edit_data,選擇新增變數

3、設定變數型別為cstring,變數名為m_data,類別為value,

4、專案的標頭檔案中自定義訊息id號:

5、在標頭檔案中宣告自定義的訊息函式:

6、在原始檔中定義訊息函式:

7、.在原始檔的begin_message_map(cmfcmultithreadtestdlg, cdialogex)和end_message_map()之間新增訊息對映:

8、在原始檔的資料處理執行緒中發訊息到ui介面:

9、本示例在乙個按鈕響應函式中,開啟了資料處理執行緒:

為了保證介面的使用者體驗經常要把資料處理等放到子執行緒中進行,然後把結果更新到主介面,通常有這樣幾種方法。

【以下內容**:vc多執行緒中控制介面控制項的幾種方法】

1.啟動執行緒時把控制項關聯變數的指標傳參給執行緒函式,這種方法無疑是最簡單的方法,但極容易造成訪問異常,因為vc6中的控制項都不是執行緒安全的。

2.就是先進一點的方法,把控制項的控制代碼傳給執行緒函式,在子執行緒中通過sendnotifymessage or postmessage等進行操作。這種方法是執行緒安全的,但對許多未公開控制項你根本不知道要傳送什麼訊息的,比如絕大多數的activex控制項,像msflexgrid、dbgrid,它們的訊息id是無從知曉的,這種時候第二種方法就沒用了。

3.這種方法我感覺是最萬能的方法了,而且這樣**的邏輯也最清楚。就是在視窗類中針對執行緒要進行的操作自定義訊息,啟動執行緒時直接把視窗的控制代碼傳給執行緒函式,執行緒要控制介面時直接給視窗發訊息就可以了。視窗類中對自定義訊息新增訊息對映,在其中進行具體的控制操作。

希望大家少走一點彎路,前兩天我就是因為要操作msflexgrid,然後搜了n久都沒找到直接給其發訊息的方法,當時我曾用了種極弱的方法,就是先把資料寫入乙個全域性變數中,然後在視窗中起定時器將全域性變數中的資料重新整理到控制項中,現在想來是相當傻了。

MFC利用執行緒更新介面

error c2665 afxbeginthread 2 個過載中沒有乙個可以轉換所有引數型別 1.執行緒函式 必須是 靜態類成員函式 或者 全域性函式 cwinthread pthread afxbeginthread connectfunc,lpvoid this static uint con...

工作執行緒中如何更新介面

工作執行緒在更新程式介面時,很多時候會出現莫名奇妙的錯誤。我想了很多方法都不行,今天從委託中得到了靈感。那就是觸發介面的事件。主要的流程是 自定義事件訊息 如 define wm showflashadv wm user 103 自定義事件函式 lresult cadvisorywidgetdlg ...

C 執行緒中更新介面控制項

在我們開發軟體時經常會需要跟新介面上的某個控制項來顯示相關的資訊。當我們的介面需要在程式執行中不斷更新資料時,當乙個textbox的資料需要變化時,為了讓程式執行中不出現介面 卡死的現像,最好的方法就是 多執行緒來解決 乙個主線程來 建立介面,使用乙個子執行緒來執行程式並 更新主介面,這樣就不會出現...