線程中調用UpdateData函數


UpdateData(TRUE)         控件的值—>變量

UpdateData(FALSE)       變量值—>控件顯示

 

當你使用UpdateDate()函數的時候,你要清楚一個重要的點,那就是它的范圍是你調用它的類所代表的框架中生效。
舉個例子:
我們有一個主對話框,然后在其中建立了三個標簽頁。三個標簽頁分別關聯了三個類。
那么我們要在主對話框中使用標簽頁中關聯了一個編輯框的變量時,如果你使用UpdateData(false)的時候,你會發現沒有效果。
你必須用標簽頁的類如CPage0 page0; page0.UpdateData(false);才會達到你的目的。

注意:
    1.用於數據交換的DoDataExchange函數是不能被直接調用的,必須通過調用UpdateData()函數來調用DoDataExchange函數。
所以在用到控件與關聯的成員變量交換數據時,要首先調用UpdateData()函數。

    2.當模態對話框被創建時,在OnInitialDialog()函數里framework自動的調用UpdateData(FALSE)。該函數的調用在對話框出現之前。
而且在默認的接口函數OnOk()里也調用了該函數UpdateData(TRUE)來獲取數據,如果調用成功,將會關閉對話框。(如果單擊Cancel按鈕,就不會調用該函數)


在線程中使用UpdateData(FALSE)來更新窗口的內容,結果在Debug版本下面就出現了Assert報錯
       
原因:
    簡單的說,不能跨線程訪問MFC窗口對象。MFC句柄封裝類只在創建句柄的線程中有效,在其它線程中訪問會出現無法預料的結果。適當的訪問方式是直接訪問句柄。你需要另外想辦法,例如在線程類中聲明一個指針,AfxBeginThread的時候以暫停方式啟動線程,設置指針為文檔指針之后繼續線程的運行。              參考http://support.microsoft.com/default.aspx?scid=kb;en-us;147578 

解決方案:
    UpdateData(FALSE)語句用SendMessage(WM_UPDATEDATA, FALSE)替代即可.
在abc.h文件中:        #define   WM_UPDATEDATA   WM_USER + 5 
                                LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);
在abc.cpp文件中:    //函數映射 :
                                ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)
                                //定義新函數:
                                LRESULT CProtectPage::OnUpdateData(WPARAM wParam, LPARAM lParam)
                                {
                                         UpdateData(wParam);
                                         return 0;
                                }
                                //傳消息給窗口:
                                SendMessage(WM_UPDATEDATA, FALSE)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM