摘要:關於MFC多執行緒的應用的深入研究。
步驟/方法
使用執行緒步驟:
定義執行緒函式傳遞引數結構
如:
typedef struct tagTHREADParmS
{
//CString content;
HWND hwnd;
int window;
int state;
Monitor *mm;
int thread_id;
}THREADParmS;
定義執行緒函式:
如:
UINT read(LPVOID pParam)
{
THREADPARMS *p=(THREADParmS*)pParam;
HWND hwnd=p->hwnd;
int edit=p->window;
Monitor *mon=p->mm;
mon->add_reader(p);
SetDlgItemText(hwnd,p->state,"正在讀取");
Sleep(2000);
char * str=new char[1000];
GetDlgItemText(hwnd,IDC_DISPLAY,str,1000);
SetDlgItemText(hwnd,edit,str);
mon->complete_reader(p);
SetDlgItemText(hwnd,p->state,"讀取完成");
delete p;
return 0;
}
啟動執行緒
如:
THREADPARMS *ptp=new THREADParmS;//初始化執行緒引數結構
ptp->hwnd=m_hWnd;//對PTP結構賦值
//ptp->content=str;
ptp->mm=mm;
ptp->window=window;
ptp->thread_id=thead_id;
ptp->state=state;
AfxBeginThread(read,ptp);//啟動執行緒
執行緒的掛起和重啟
掛起執行緒
SuspendThread(HANDLE);
注意:執行緒暫停後便停止執行,也就是說執行緒可以自己掛起自己,但無法自己喚醒自己。
喚醒執行緒
ResumeThread(HANDLE);
對於CWinThread 類,只要使用m_hThread成員,即為HANDLE變數。
超級注意:GetCurrentThread()得到的是一個當前的執行緒的handle,其實是一個偽HANDLE,是當前所有執行的執行緒環境的HANDLE。無法直接使用此函式得到的handle喚醒執行緒。但是使用一些其他函式後可以,我沒有嘗試。
還有,MFC中的執行緒是不安全的。不安全的含義是:當兩個執行緒同時訪問同一個臨界資源時,系統會允許。這就會產生一些不可預知的錯誤。
解決的方法時使用程序的同步類或者自己編寫程式碼實現執行緒互斥訪問和同步。