主行程用AfxBeginThread 創建執行緒 CMyThread, 在CMyThread中創建CMyDlg
CMyDlg在回應它視窗中的button時候,需要把一些資料傳遞給主行程?
有哪些好的方法?
uj5u.com熱心網友回復:
各位大神門,我知道這種情況用作業執行緒更好一點,不過我就想知道用界面執行緒的話,界面執行緒中視窗的資料怎么傳出給主行程謝謝了
uj5u.com熱心網友回復:
貌似只能SendMessageeuj5u.com熱心網友回復:
印象中MFC工程多個執行緒去各自開視窗的方式,踩過坑。。所以我現在根本不嘗試這種辦法,都會界面是界面,功能另外分開寫。
執行緒間通信方式很多,訊息、mailslot、管道、filemapping等等都可以,如果你不確定以后要擴展成怎樣,就用開socket的方式。
uj5u.com熱心網友回復:
執行緒函式中的引數 LPVOID 萬能指標, 可以構造一個結構體,把需要傳遞資訊的視窗關聯起來,執行緒中根據傳遞的視窗句柄傳遞資訊比如
//執行緒引數結構體
typedef struct _tagThreadParam_t
{
HANDLE hThread; //執行緒句柄
BOOL bThreadExitFlag; //執行緒退出標記
HWND hWnd; //視窗句柄
int iCount;
//……
_tagThreadParam_t()
{
memset(this, 0, sizeof(*this));
}
}THREADPARAM, *LPTHREADPARAM;
//執行緒引數( 注意其生命周期 )
THREADPARAM tParam;
//執行緒函式
DWORD CALLBACK TestThread(LPVOID lParam)
{
THREADPARAM *pThreadParam = (THREADPARAM*)lParam;
while(! pThreadParam->bThreadExitFlag) /*非退出標記*/
{
//更新視窗控制元件
CString szVal;
szVal.Format(_T("%d"), pThreadParam->iCount++);
SetDlgItemText(pThreadParam->hWnd, IDC_TEST_EDIT, szVal);
//執行緒切換
Sleep(100);
}
return 0;
}
//啟動執行緒
void CdlgTDlg::OnBnClickedButton1()
{
tParam.bThreadExitFlag = 0;
tParam.hWnd = m_hWnd;
tParam.iCount = 1000;
tParam.hThread = CreateThread(NULL, 0, TestThread, &tParam, 0, NULL);
}
//停止執行緒
void CdlgTDlg::OnBnClickedButton2()
{
tParam.bThreadExitFlag = -1;
if(tParam.hThread)
{
WaitForSingleObject(tParam.hThread, 1000);
CloseHandle(tParam.hThread);
tParam.hThread = NULL;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/245380.html
標籤:進程/線程/DLL
