線程中使用UpdateData出錯解決方法


最近寫一個程序,需要在自己創建的工作線程中更新窗口數據。在使用UpdataData(false)來實現時,總是報錯,在網上搜了一下,才知道在
工作線程中不能使用UpdateData來更新主線程中的數據。界面的東西,最好就是用主線程(界面線程)去執行相應的操作。要想在子線程(工作線程)裏執行界面線程的操作,最好是向主線程發送消息。因爲MFC的CWnd用到了TLS,所以不是線程安全的。
解決辦法:

1.定義一個消息 #define WM_UPDATE_MESSAGE (WM_USER+200)

2.定義消息映射

BEGIN_MESSAGE_MAP(CCServerDlg, CDialog)
//{{AFX_MSG_MAP(CCServerDlg)
...
ON_MESSAGE(WM_UPDATE_MESSAGE, OnUpdateMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

3. 定義消息處理函數

// Generated message map functions
//{{AFX_MSG(CCServerDlg)

...
afx_msg LRESULT OnUpdateMessage(WPARAM wParam, LPARAM lParam); 

//}}AFX_MSG
DECLARE_MESSAGE_MAP()

4. 完成函數內容,只需調用UpdateData()即可

LRESULT CXXXDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam)
{
UpdateData(false);
return 0;
}

5.線程中的調用

UINT CXXXDlg::ClientThread(LPVOID lpParam)
{

CXXXDlg *pt=(CCServerDlg*)CWnd::FromHandle(((CCServerDlg*)lpParam)->m_hWnd);//get the handle to post message

pt->PostMessage(WM_UPDATE_MESSAGE,0,0);//OK - UpdateDate

//message sended to "pt"

...


}


6.程序中調用

// CWinThread* pThread;
// static UINT ClientThread(LPVOID lpParm);


void CCServerDlg::OnSStart() 
{

...

pThread=AfxBeginThread(ClientThread,this);

...

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章