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 }