mfc 窗口退出清理工作

写了个带界面的播放控件,有多个播放窗格,每个窗格播放时会创建各自的码流接收和解码等相关子线程。

出现现象:窗口正在播放(有线程在工作)直接关闭程序,会出现程序崩溃。

解决:播放窗格类中重写OnDestroy(),进行线程清理工作。

void CShowDlg::OnDestroy()
{
	CDialogEx::OnDestroy();
	// TODO: 在此处添加消息处理程序代码
	int threadNum = 0;
	m_isPlaying = 0;    //设置标志,让各个线程自动退出
	do                    
	{        
        //循环等待所有线程退出
		threadNum = getThreadNum();
		if(threadNum != 0)
			Sleep(10);
	}while (threadNum != 0);
}

其它知识记录:

OnClose():消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候(而不是我们眼睛所见的对话框从屏幕上消失时),该函数被调用,用户在响应OnOk()或者OnCancel()函数之后,不会发送WM_CLOSE消息

OnDestroy():消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送

在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为
(1)用户点击退出按钮,发送了WM_CLOSE消息
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()
(3)在DestroyWindow()中发送了WM_DESTROY消息
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环

综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用),所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose(),否则就有可能会出现内存泄漏的危险了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值