子執行緒中呼叫UpdateData(TRUE/FALSE)出現異常解決方法
阿新 • • 發佈:2018-11-28
使用子執行緒去呼叫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.程式中啟動執行緒