C++/MFC線程間通信


1.通過全局變量方式

mfcDlg.cpp

 1 int g_num; //全局變量
 2 UINT _cdecl ThreadWrite(LPVOID lpParameter)
 3 {
 4     g_num = 100;
 5     while (1)
 6     {        
 7         g_num++;
 8         Sleep(50);
 9     }
10     return 0;
11 }
12 UINT _cdecl ThreadRead(LPVOID lpParameter)
13 {
14     CString str;
15     while (true)
16     {
17         str.Format(_T("%d"),g_num);
18         AfxMessageBox(str);
19     }
20     return 0;
21 }
22 
23 void CmfcThreadDlg::OnBnClickedOk()
24 {
25     AfxBeginThread(ThreadWrite, NULL);
26     AfxBeginThread(ThreadRead, NULL);
27 }

如果要在1.cpp中使用g_num,需要在mfcDlg.cpp的頭文件中聲明extern int g_num。1.cpp中要包含mfcDlg.h

2.通過主對話框類的成員變量,在創建線程時傳遞主對話框類的指針;

3.界面線程間通信。

界面線程創建時,無法傳遞參數。

主線程在創建界面線程時,有返回值CWinThread*,即是子線程的指針,使用時類型轉換即可。

1 void CmfcThreadDlg::OnBnClickedthread()
2 {
3     // TODO: 在此添加控件通知處理程序代碼
4     //創建界面線程
5     CWinThread* pthread= AfxBeginThread(RUNTIME_CLASS(CUIThreadApp));
6     ((CUIThreadApp*)pthread)->child_num = 100; //child_num為子線程的成員變量
7 }

子線程被創建后可以通過AfxGetApp來得到項目主線程的指針。

1 void CTestDlg::OnBnClickedCancel()
2 {
3     // TODO: 在此添加控件通知處理程序代碼
4     CWinApp* pApp = AfxGetApp();
5     ((CmfcThreadApp*)pApp)->parent_num=1000;  //項目主線程為cmfcThreadApp
6 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM