主线程中等待子线程结束

void CATCommandDlg::OnButtonStart() 
{
	//YH012000000006
	UpdateData();

	char strMcu[100];
	DWORD dwThreadID;
	memset(strMcu,0,100);
	ShowCalResult(Testing);
	UpdataClear(1);
	if (!CheckSNIMEIBT()) 
	{
		UpdataClear(0);
		return;
	}
// 	selMcu=m_Config.m_iCom/*this->m_ComMCU.GetCurSel()*/;
// 	if(selMcu < 0)
// 	{
// 		Display(">>>>>>>>Please Choose ModemCOM And MCUCOM!",0);
// 		UpdataClear(0);
// 		return;
// 	}

	if(m_Config.m_iCheckStation == LATESTRECORDITEM)
	{
		hCommWatchThread = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
			0,
			(LPTHREAD_START_ROUTINE)LatestRecordProc,
			this,
			0,
		&dwThreadID );
	}
	else
	{
		hCommWatchThread = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
			0,
			(LPTHREAD_START_ROUTINE)CommWatchProc,
			this,
			0,
		&dwThreadID );
	}
#if 1
	/* 
	 * 主线程中不要使用WaitForSingleObject和WaitForMultiObjects两个函数等待线程退出,原因就是有导致程序死锁的隐患
	 * 特别是线程函数里调用了SendMessage或者直接操作了MFC对象,更容易出现此种现象。为了解决这个问题,微软特别提供了
	 * 一个函数,MsgWaitForMultipleObjects

     * 这个函数可以实现等待线程hCommWatchThread退出,然后设置焦点(调用SetWindowFocus()),但是在显示激活码的时候会有卡顿

	 * 
	 * 当然这里也可以在这里另外开启一个线程来等待这个线程结束,结束的话,就在新开启的线程中发消息去处理主线程的Control
	 * 我没有去用这种方式处理,应该这样也可以
	*/
	DWORD dRet = -2;
	MSG msg;
	while(1){
		dRet = MsgWaitForMultipleObjects(1,&hCommWatchThread,
			FALSE,INFINITE,QS_ALLINPUT|QS_ALLPOSTMESSAGE);
		if(dRet == WAIT_OBJECT_0){
			CloseHandle(hCommWatchThread);
			SetWindowFocus();
			break;
		}else{
			/* 
			 * 本来只有PeekMessage这一句,后来感觉显示激活码的时候有卡顿,并且在置灰激活码编辑框的时候没有起作用
			 * 就加了TranslateMessage和DispatchMessage这两句
			 */
			if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
	}
	
#endif

	
}

猜你喜欢

转载自blog.csdn.net/yangkunhenry/article/details/103265514