1. 程式人生 > >子執行緒中呼叫UpdateData(TRUE/FALSE)出現異常解決方法

子執行緒中呼叫UpdateData(TRUE/FALSE)出現異常解決方法

       使用子執行緒去呼叫UpdateData(TRUE/FALSE)方法更新窗體控制元件值時,總是會彈出“Debug Assertion Failed”異常錯誤;

       原因是:工作執行緒(子執行緒)中不能使用UpdateData來更新主執行緒中的資料。介面的東西,最好就是用主執行緒(介面執行緒)去執行相應的操作。要想在子執行緒(工作執行緒)裡執行介面執行緒的操作,最好是向主執行緒傳送訊息。因為MFC的CWnd用到了TLS,所以不是執行緒安全的。

      解決方法:使用訊息機制,PostMessage或者SendMessage方式給主執行緒傳送訊息,讓主執行緒來實現重新整理的操作。

1、定義一個訊息 #define WM_UPDATE_MESSAGE (WM_USER+100)

2、定義訊息對映 BEGIN_MESSAGE_MAP(CCServerDlg, CDialog)
{
{AFX_MSG_MAP(CCServerDlg)
...
ON_MESSAGE(WM_UPDATE_MESSAGE, &CXXXDlg::OnUpdateMessage)

}}AFX_MSG_MAP
END_MESSAGE_MAP()

3、在標頭檔案中定義訊息處理函式
afx_msg LRESULT OnUpdateMessage(WPARAM wParam, LPARAM lParam); 


4. 完成函式內容,只需呼叫UpdateData()即可 LRESULT CXXXDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam)
{
UpdateData(false);
return 0;
}
5.執行緒中的呼叫傳送訊息的方法 PostMessage(WM_UPDATE_MESSAGE ,NULL,NULL);
6.程式中啟動執行緒