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);
}
準確的說,這些代碼並不是自己原創,是參考一篇文檔《多線程編程的入門教程》。但根據自己的要求也改了改,也就假裝自己是原創吧。