线程中调用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