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);
}
准确的说,这些代码并不是自己原创,是参考一篇文档《多线程编程的入门教程》。但根据自己的要求也改了改,也就假装自己是原创吧。