多线程实例二
此实例演示采用CreateThread函数在主线程中创建一个线程,并且向创建的线程中传递一个参数。
由于采用MFC编程,自动生成的代码比较多,还是列出部分实现多线程的代码。
线程函数:
- void ThreadProc(int count)
- {
- for (int i=0; i < count; i++)
- {
- Beep(2000,50);
- Sleep(200);
- }
- }
主线程函数:
- void CMthread2Dlg::OnStart()
- {
- // TODO: Add your control notification handler code here
- UpdateData(TRUE);//从控件中检索数据
- int count = m_count;
- hThread = CreateThread(NULL,
- 0,
- (LPTHREAD_START_ROUTINE)ThreadProc,
- (VOID *)count,
- 0,
- &threadID
- );
- GetDlgItem(IDC_START)->EnableWindow(FALSE);
- WaitForSingleObject(hThread,INFINITE); //当线程挂起时,为有信号状态
- GetDlgItem(IDC_START)->EnableWindow(TRUE);
- }
函数说明:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
MFC中的窗口函数,在对话框中,当建立控件和变量之间的关联关系后,修改变量值,希望对话框更新显示,则bSaveAndValidate=FALSE,即调用UpdateData(FALSE);当需要获取对话框中控件输入的值时,则bSaveAndValidate=TRUE,即调用UpdateData(TRUE)。
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
此函数的详细描述参见:http://blog.csdn.net/richerg85/article/details/7354154
注意:
主线程中,调用了WaitForSingleObject函数,此函数的作用是监视hHandle的状态,当监视的句柄为有信号状态时,即此对象为空闲状态时,此函数返回,才能执行其后的代码。
在此处,用WaitForSingleObject作用:
由于c++主程序终止,同时它创建的相应的线程也会终止,它不管子线程是否执行完成,因此,上文中如果不调用WaitForSingleObject函数,则子线程ThreadProc可能没有执行完或者没执行。
此程序执行结果图:
多线程实例三
此实例演示多线程中,主线程向子线程传递一个结构体。
在头文件中,声明线程函数及结构体:
- UINT ThreadProc(LPVOID lpParam);
- struct threadInfo
- {
- UINT nMilliSecond;
- CProgressCtrl *pctrProcess;
- };
子线程定义函数
- threadInfo myInfo;
- UINT ThreadProc(LPVOID lpParam)
- {
- threadInfo *pInfo = (threadInfo *)lpParam;
- for (int i=0; i<100; i++)
- {
- int iTmp = pInfo->nMilliSecond;
- pInfo->pctrProcess->SetPos(i);
- Sleep(iTmp);
- }
- return 0;
- }
- void CMthread3Dlg::OnStart()
- {
- // TODO: Add your control notification handler code here
- UpdateData();//默认为TRUE
- myInfo.nMilliSecond = m_nMillSecond;
- myInfo.pctrProcess = &m_ctrProcess;
- hThread = CreateThread(NULL,
- 0,
- (LPTHREAD_START_ROUTINE)ThreadProc,
- &myInfo,
- 0,
- &threadID
- );
- /*GetDlgItem(IDC_START)->EnableWindow(FALSE);
- WaitForSingleObject(hThread,INFINITE);
- GetDlgItem(IDC_START)->EnableWindow(TRUE);*/
- }
注意注释的部分,如果调用WaitForSingleObject函数,此程序会出现死锁。因为对话框中有个进度条,子线程中设置进度条的进度,但是进度条的刷新需要主线程来完成,当主线程调用WaitForSingleObject函数挂起后,子线程设置正在设置进度条,一直等待主线程将刷新消息出来完毕返回才检测通知事件。这样两个线程一直处于相互等待,出现死锁。
程序执行结果:
程序完整源代码下载地址: