Win32 API 多線程編程例程一

例程1 MultiThread1

  1. 建立一個基於對話框的工程MultiThread1,在對話框IDD_MULTITHREAD1_DIALOG中加入兩個按鈕和一個編輯框,兩個按鈕的ID分別是IDC_START,IDC_STOP ,標題分別爲“啓動”,“停止”,IDC_STOP的屬性選中Disabled;編輯框的ID爲IDC_TIME ,屬性選中Read-only;
     
  2. 在MultiThread1Dlg.h文件中添加線程函數聲明:
    void ThreadFunc();
    
    注意,線程函數的聲明應在類CMultiThread1Dlg的外部。 在類CMultiThread1Dlg內部添加protected型變量:
    	HANDLE hThread;
    	DWORD ThreadID;
    
    分別代表線程的句柄和ID。
     
  3. 在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編寫的多線程。
發佈了20 篇原創文章 · 獲贊 9 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章