MFC线程退出方法

MFC使用AfxBeginThread创建线程退出方法:

CWinThread * myThread;    //线程
bool isThreadBegin = false;  //线程退出/执行控制
	
	//创建线程
    void CDlg::OnButtonCreateThread()
    {
    	isThreadBegin  = true;            //运行线程执行
    	myThread = AfxBeginThread(MyThreadProc, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
    }
	//线程函数
	UINT _cdecl CDlg::MyThreadProc(LPVOID lpram)
	{
		...
		while(isThreadBegin )
		{
			...
			break;
		}
		return 0;    //线程返回值,线程最好通过返回值退出线程,这样会释放线程所有资源
	}
	//停止线程
	 void CDlg::OnButtonStopThread()
    {
    	isThreadBegin  = false;            //停止线程执行
    	WaitForSingleObject(myThread->m_hThread, INFINITE);   //一直等待线程退出
    }

不推荐使用ExitThread,和TerminateThread来退出线程。
如果线程处于挂起状态,且没有被唤醒,使用上述方法结束线程的时候,会出现程序"假死"的现象。因为此时线程被挂起,系统不会给该线程分配时间片运行程序,所以线程不能通过return结束,因此WaitForSingleObject(myThread->m_hThread, INFINITE)一直在等待,造成程序没有反应。故当线程被挂起,而想要结束线程时,需要先唤醒线程。
下面是WaitForSingleObject的使用说明

 DWORD WaitForSingleObject(    
 	HANDLE hObject, //指明一个内核对象的句柄    
	DWORD dwMilliseconds); //等待时间

该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态(如果内核对象是线程,若线程结束,为通知状态;若线程未结束,为非通知状态),则该函数导致线程进入阻塞状态;如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。
第二个参数指明了需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去;如果第二个参数为0,那么函数就测试同步对象的状态并立即返回;如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值