c++多线程(二)

多线程实例二

此实例演示采用CreateThread函数在主线程中创建一个线程,并且向创建的线程中传递一个参数。

由于采用MFC编程,自动生成的代码比较多,还是列出部分实现多线程的代码。

线程函数:

[cpp]  view plain copy
  1. void ThreadProc(int count)  
  2. {  
  3.     for (int i=0; i < count; i++)  
  4.     {  
  5.         Beep(2000,50);  
  6.         Sleep(200);  
  7.     }  
  8. }  

主线程函数:

[cpp]  view plain copy
  1. void CMthread2Dlg::OnStart()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     UpdateData(TRUE);//从控件中检索数据  
  5.     int count = m_count;  
  6.   
  7.   
  8.     hThread = CreateThread(NULL,  
  9.                            0,  
  10.                            (LPTHREAD_START_ROUTINE)ThreadProc,  
  11.                            (VOID *)count,  
  12.                            0,  
  13.                            &threadID  
  14.                            );  
  15.   
  16.   
  17.     GetDlgItem(IDC_START)->EnableWindow(FALSE);  
  18.     WaitForSingleObject(hThread,INFINITE); //当线程挂起时,为有信号状态  
  19.     GetDlgItem(IDC_START)->EnableWindow(TRUE);  
  20. }  
注:变量m_count和控件IDC_COUNT做了关联。
函数说明:

     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可能没有执行完或者没执行。

  

此程序执行结果图:


多线程实例三

此实例演示多线程中,主线程向子线程传递一个结构体。

在头文件中,声明线程函数及结构体:

[cpp]  view plain copy
  1. UINT ThreadProc(LPVOID lpParam);  
  2. struct threadInfo  
  3. {  
  4.     UINT nMilliSecond;  
  5.     CProgressCtrl *pctrProcess;  
  6. };  

子线程定义函数

[cpp]  view plain copy
  1. threadInfo myInfo;  
  2. UINT ThreadProc(LPVOID lpParam)  
  3. {  
  4.     threadInfo *pInfo = (threadInfo *)lpParam;  
  5.     for (int i=0; i<100; i++)  
  6.     {  
  7.         int iTmp = pInfo->nMilliSecond;  
  8.         pInfo->pctrProcess->SetPos(i);  
  9.         Sleep(iTmp);  
  10.     }  
  11.     return 0;  
  12. }  
主线程调用子线程函数:

[cpp]  view plain copy
  1. void CMthread3Dlg::OnStart()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     UpdateData();//默认为TRUE  
  5.     myInfo.nMilliSecond = m_nMillSecond;  
  6.     myInfo.pctrProcess = &m_ctrProcess;  
  7.   
  8.     hThread = CreateThread(NULL,  
  9.                             0,  
  10.                             (LPTHREAD_START_ROUTINE)ThreadProc,  
  11.                             &myInfo,  
  12.                             0,  
  13.                             &threadID  
  14.                             );  
  15.     /*GetDlgItem(IDC_START)->EnableWindow(FALSE); 
  16.     WaitForSingleObject(hThread,INFINITE); 
  17.     GetDlgItem(IDC_START)->EnableWindow(TRUE);*/  
  18. }  

注意注释的部分,如果调用WaitForSingleObject函数,此程序会出现死锁。因为对话框中有个进度条,子线程中设置进度条的进度,但是进度条的刷新需要主线程来完成,当主线程调用WaitForSingleObject函数挂起后,子线程设置正在设置进度条,一直等待主线程将刷新消息出来完毕返回才检测通知事件。这样两个线程一直处于相互等待,出现死锁。

程序执行结果:


程序完整源代码下载地址:

http://download.csdn.net/detail/richerg85/4215491

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值