例程1 MultiThread1
- 建立一個基於對話框的工程MultiThread1,在對話框IDD_MULTITHREAD1_DIALOG中加入兩個按鈕和一個編輯框,兩個按鈕的ID分別是IDC_START,IDC_STOP ,標題分別爲“啓動”,“停止”,IDC_STOP的屬性選中Disabled;編輯框的ID爲IDC_TIME ,屬性選中Read-only;
- 在MultiThread1Dlg.h文件中添加線程函數聲明:
void ThreadFunc();
注意,線程函數的聲明應在類CMultiThread1Dlg的外部。 在類CMultiThread1Dlg內部添加protected型變量:HANDLE hThread; DWORD ThreadID;
分別代表線程的句柄和ID。
- 在MultiThread1Dlg.cpp文件中添加全局變量m_bRun :
volatile BOOL m_bRun;
m_bRun 代表線程是否正在運行。
你要留意到全局變量 m_bRun 是使用 volatile 修飾符的,volatile 修飾符的作用是告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,並且該值可被外部改變。對於多線程引用的全局變量來說,volatile 是一個非常重要的修飾符。
編寫線程函數:void ThreadFunc() { CTime time; CString strTime; m_bRun=TRUE; while(m_bRun) { time=CTime::GetCurrentTime(); strTime=time.Format("%H:%M:%S"); ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime); Sleep(1000); } }
該線程函數沒有參數,也不返回函數值。只要m_bRun爲TRUE,線程一直運行。
雙擊IDC_START按鈕,完成該按鈕的消息函數:void CMultiThread1Dlg::OnStart() { // TODO: Add your control notification handler code here hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, NULL, 0, &ThreadID); GetDlgItem(IDC_START)->EnableWindow(FALSE); GetDlgItem(IDC_STOP)->EnableWindow(TRUE); }
雙擊IDC_STOP按鈕,完成該按鈕的消息函數:void CMultiThread1Dlg::OnStop() { // TODO: Add your control notification handler code here m_bRun=FALSE; GetDlgItem(IDC_START)->EnableWindow(TRUE); GetDlgItem(IDC_STOP)->EnableWindow(FALSE); }
編譯並運行該例程,體會使用Win32 API編寫的多線程。