MFC多线程(3个以上)实现

该博客介绍了如何在MFC环境下使用CWinThread创建并管理两个线程,分别是TESTThread和TESTThread1。每个线程包含一个循环,通过Sleep函数控制间隔,当条件满足时调用相应的处理函数TESTProc和TESTProc1。在处理过程中,如果遇到错误,会弹出消息框提示用户。退出线程时,通过设置标志位和WaitForSingleObject进行安全退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 h文件:

 CWinThread* pTESTThread;
 BOOL bRun;
 BOOL bIsTesting;
 BOOL bThreadExit;

 BOOL TESTProc1();
 CWinThread* pTESTThread1;
 BOOL bRun1;
 BOOL bIsTesting1;
 BOOL bThreadExit1;

 

cpp文件:

UINT TESTThread( LPVOID pParam )
{
 CTestDlg *pTESTdlg = (CTestDlg *)pParam;
 
 while(pTESTdlg->bThreadExit == FALSE)
 {
  Sleep(50);
  if(pTESTdlg->bRun)
  {
   pTESTdlg->bIsTesting  = TRUE;
   if(pTESTdlg->TESTProc() == FALSE)
   {
    AfxMessageBox("生成报告出错,请关闭打开的测试报告!");
   }
   pTESTdlg->bRun = FALSE;
   ::SendMessage(pTESTdlg->m_hWnd, WM_TESTDLG_UPDATEDATA, (WPARAM)FALSE, NULL); //进程函数中不能直接调用updatedata函数
   //AfxMessageBox("测量过程停止,重新测量请按Run!");
  }
  else
  {
   pTESTdlg->bIsTesting = FALSE;
   Sleep(20);
  }
 }
 
 return 0;
}

UINT TESTThread1( LPVOID pParam )
{
 CTestDlg *pTESTdlg = (CTestDlg *)pParam;
 
 while(pTESTdlg->bThreadExit1 == FALSE)
 {
  Sleep(20);
  if(pTESTdlg->bRun1)
  {
   pTESTdlg->bIsTesting1  = TRUE;
   if(pTESTdlg->TESTProc1() == FALSE)
   {
    AfxMessageBox("fail");
   }
   pTESTdlg->bRun1 = FALSE;
   ::SendMessage(pTESTdlg->m_hWnd, WM_TESTDLG_UPDATEDATA, (WPARAM)FALSE, NULL); //进程函数中不能直接调用updatedata函数
   //AfxMessageBox("测量过程停止,重新测量请按Run!");
  }
  else
  {
   pTESTdlg->bIsTesting1 = FALSE;
   Sleep(20);
  }
 }
 
 return 0;
}

 

 初始化:

 bRun = FALSE;
 bIsTesting = FALSE;
 bThreadExit = FALSE; 
 pTESTThread = AfxBeginThread(TESTThread, this);
 
 bRun1 = FALSE;
 bIsTesting1 = FALSE;
 bThreadExit1 = FALSE;
 pTESTThread1 = AfxBeginThread(TESTThread1, this);

 

退出操作:

 bThreadExit = TRUE;
 ::WaitForSingleObject((HANDLE)pTESTThread->m_hThread, INFINITE);

 bThreadExit1 = TRUE;
 ::WaitForSingleObject((HANDLE)pTESTThread1->m_hThread, INFINITE);

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值