MFC下多线程UpdateData的使用方法


本文转载于 http://blog.pfan.cn/yuqiexing/52543.html

线程中是不可以调用父窗口的UpdateData,原因如下:

 

当创建窗口的线程和UpdateData调用所在的线程不是同一线程的时候MFC就会出错。为MFC把部分信息储存在线程的TLS中,这些信息对于MFC的执行非常重要,因此MFC会在很多代码里面检查线程状态是否正确。当在线程中调用父窗口的UpdateData时,相对于UpdateData的线程环境已经改变了,所以就会出错了。

可以使用如下方案:
1,在线程中使用 pDLG->GetDlgItem(ID)->SetWindowText(str)
2,线程向父对话框发送自定义消息,消息响应函数里调用UpDateData,该方案详见:

http://blog.csdn.net/zfpnuc/archive/2010/10/15/5944219.aspx

 

  • 在randomDlg.h 
    1. //定义用户消息,不可与系统消息冲突,所以就这样定义  
    2. //WM+USER表示用户消息,加100还是加其他值并没多大区别的  
    3. #define WM_MYUPDATEDATA WM_USER+100  
  • 在线程内
    1. //向主程序框架MainFrm发送消息  
    2. //SendMessage第二第三参数可以为其他更多的类型,不局限于此  
    3. DWORD RondomLeftThread(CRandomDlg *p)  
    4. {  
    5.       p->SendMessage(WM_MYUPDATEDATA,FALSE);  
    6. }  
    7. //调用线程的地方  
    8. hThread_1=CreateThread(NULL,  
    9.         0,  
    10.         (LPTHREAD_START_ROUTINE)RondomLeftThread,  
    11.         this,  
    12.         0,  
    13.         (unsigned long *)&ThreadID);  
  • 在randomDlg.cpp内
    1. //关联自定义消息  
    2. BEGIN_MESSAGE_MAP(CRandomDlg, CDialog)  
    3.     //{{AFX_MSG_MAP(CRandomDlg)  
    4.     ON_WM_PAINT()  
    5.     ON_WM_QUERYDRAGICON()  
    6.     ON_MESSAGE(WM_MYUPDATEDATA,OnUpdateMyData)  
    7.     //}}AFX_MSG_MAP  
    8. END_MESSAGE_MAP()  
  • 定义OnUpdateMyData
    1. class CRandomDlg : public CDialog  
    2. {  
    3. // Construction  
    4. public:  
    5.     CRandomDlg(CWnd* pParent = NULL);   // standard constructor  
    6.   
    7. // Dialog Data  
    8.     //{{AFX_DATA(CRandomDlg)  
    9.     enum { IDD = IDD_RANDOM_DIALOG };  
    10.     HANDLE hThread_1;  
    11.     HANDLE hThread_2;  
    12.     //}}AFX_DATA  
    13.     // ClassWizard generated virtual function overrides  
    14.     //{{AFX_VIRTUAL(CRandomDlg)  
    15.     protected:  
    16.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  
    17.     //}}AFX_VIRTUAL  
    18.   
    19. // Implementation  
    20. protected:  
    21.     HICON m_hIcon;  
    22.   
    23.     // Generated message map functions  
    24.     //{{AFX_MSG(CRandomDlg)  
    25.     virtual BOOL OnInitDialog();  
    26.     afx_msg void OnPaint();  
    27.     afx_msg HCURSOR OnQueryDragIcon();  
    28.     LRESULT OnUpdateMyData(WPARAM wParam, LPARAM lParam);  
    29.     //}}AFX_MSG  
    30.     DECLARE_MESSAGE_MAP()  
    31. public:  
    32.     void EnableDisplay(int,BOOL);  
    33. };  
  • 实现OnUpdateMyData
    1. LRESULT CRandomDlg::OnUpdateMyData(WPARAM wParam, LPARAM lParam)  
    2. {  
    3.     UpdateData(wParam);  
    4.     return 1;  
    5. }  

你可能感兴趣的:(MFC下多线程UpdateData的使用方法)