壹. 使用線程步驟:
1. 定義線程函數傳遞參數結構
如:
typedef struct tagTHREADParmS
{
//CString content;
HWND hwnd;
int window;
int state;
Monitor *mm;
int thread_id;
}THREADParmS;
2. 定義線程函數:
如:
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;
}
3. 啟動線程
如:
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);//啟動線程
二. 線程的掛起和重啟
1. 掛起線程
SuspendThread(HANDLE);
註意:線程暫停後便停止運行,也就是說線程可以自己掛起自己,但無法自己喚醒自己。
2.喚醒線程
ResumeThread(HANDLE);
對於CWinThread 類,只要使用m_hThread成員,即為HANDLE變量。
超級註意:GetCurrentThread()得到的是壹個當前的線程的handle,其實是壹個偽HANDLE,是當前所有運行的線程環境的HANDLE。無法直接使用此函數得到的handle喚醒線程。但是使用壹些其他函數後可以,我沒有嘗試。
還有,MFC中的線程是不安全的。不安全的含義是:當兩個線程同時訪問同壹個臨界資源時,系統會允許。這就會產生壹些不可預知的錯誤。
解決的方法時使用進程的同步類或者自己編寫代碼實現線程互斥訪問和同步。