win32 API實現多線程小例程

win32 API實現多線程小例程

1.API函數

(1)CreateThread 創建線程
(2)SuspendThread 掛起線程
(3)ResumeThread 結束線程的掛起狀態,執行線程
(4)ExitThread 該函數用於線程終結自身的執行,主要在線程的執行函數被調用。
(5)TerminateThread 強行終止某一線程的執行。注:但是使用該函數立即終止線程的執行,但並不釋放線程所佔用的資源,故不建議使用該函數。
(6)PostThreadMessage,該函數將一條消息放在指定線程的消息隊列中,並且不等到該消息該線程處理時返回。如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。

      具體的函數大家可以自行百度,應該很容易都會找到各函數的準確的定義。

2.編程實例

2.1實例1
      創建對話框,在對話框上添加兩個按鈕和一個編輯框,ID分別爲IDC_START,IDC_STOP,IDC_TIME。
頭文件:
類外添加代碼:

void ThreadFunc();    //線程函數
static BOOL m_bRun;   //全局變量

對話框類內代碼:

HANDLE hThread;       //線程函數的句柄
DWORD ThreadID;       //線程函數的ID

源文件:
類外添加代碼:

//線程函數
void ThreadFunc()
{
	CTime time;
	CString strTime;
	m_bRun = TRUE;
	while (m_bRun)
	{
		time = CTime::GetCurrentTime();
		strTime = time.Format("%Y-%m-%d %H:%M:%S %W-%A");
		::SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd, IDC_TIME, strTime);//AfxGetApp()->m_pMainWnd->m_hWnd查詢當前線程的主窗口句柄
		Sleep(1000);
	}
}

類內添加代碼:

//啓動函數
void CMultiThread1Dlg::OnBnClickedStart()
{
	// TODO: 在此添加控件通知處理程序代碼
	hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID);   //創建線程函數
	GetDlgItem(IDC_START)->EnableWindow(FALSE);   
	GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}
//暫停函數
void CMultiThread1Dlg::OnBnClickedStop()
{
	// TODO: 在此添加控件通知處理程序代碼
	m_bRun = FALSE;
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
	GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}

1.2.2 實例2
創建對話框,在對話框上添加1個按鈕和一個編輯框,ID分別爲IDC_START,IDC_COUNT。並給編輯框添加int型變量,m_nCount。
頭文件:
類外添加代碼:

void ThreadFunc(int integer);   //線程函數

對話框類內代碼:

HANDLE hThread;       //線程函數的句柄
DWORD ThreadID;       //線程函數的ID

源文件:
類外添加代碼:

//線程函數
void ThreadFunc(int integer)
{
	int i;
	for ( i = 0; i < integer; i++)
	{
		Sleep(1000);
	}
}

類內添加代碼:

//消息函數
void CMultiThread2Dlg::OnBnClickedStart()
{
	// TODO: 在此添加控件通知處理程序代碼
	UpdateData(TRUE);
	int interger = m_nCount;
	hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,(VOID*)interger,0,&ThreadID);
	GetDlgItem(IDC_START)->EnableWindow(FALSE);
	WaitForSingleObject(hThread,INFINITE);
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
}

1.2.3 實例3
      創建對話框,在對話框上添加一個按鈕、一個編輯框和一個進度條,ID分別爲IDC_MILLISECOND,IDC_PROGRESS1,IDC_START。並給編輯框添加int型變量,m_nMilliSecond;爲進度添加CProgressCtrl型變量,m_ctrlProgress。
頭文件:
類外添加變量:

struct threadinfo
{
	UINT nMilliSecond;
	CProgressCtrl *pctrlProgess;
};
//線程函數
UINT ThreadFunc(LPVOID lpParam);
static threadinfo Info;      //線程需要使用的變量

類內添加變量:

HANDLE hThread;   //線程句柄
DWORD ThreadID;   //線程ID
int m_nMilliSecond;
CProgressCtrl m_ctrlProgress;

源文件:
類外添加代碼:

//線程函數
UINT ThreadFunc(LPVOID lpParam)
{
	threadinfo *pInfo = (threadinfo *)lpParam;
	for (int i = 0; i < 100; i++)
	{
		int nTemp = pInfo->nMilliSecond;
		pInfo->pctrlProgess->SetPos(i);
		Sleep(nTemp*10);
	}
	return 0;
}

類內添加代碼:

//消息函數
void CMultiThread3Dlg::OnBnClickedStart()
{
	// TODO: 在此添加控件通知處理程序代碼
	UpdateData(FALSE);
	Info.nMilliSecond = m_nMilliSecond; 
	Info.pctrlProgess = &m_ctrlProgress;
	hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info,0,&ThreadID);
}

      準確的說,這些代碼並不是自己原創,是參考一篇文檔《多線程編程的入門教程》。但根據自己的要求也改了改,也就假裝自己是原創吧。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章