MFC控制子线程退出的基本思路比较
来源:互联网 发布:mac ctrl c 编辑:程序博客网 时间:2024/06/10 09:54
标签: 子线程退出 内存泄露 2013-02-25 10:45
要实现主线程控制子线程退出,需要考虑到子线程的响应速度和用户堆内存的泄露问题。一般来说,子线程的主体部分是一个while(1)循环。
最简单也是最直观的办法是采用全局变量,如在主对话框类头文件中定义一个static BOOL g_ExitThread;子线程程序主体改写为while(g_ExitThread);然后在该循环之外做好收尾工作(释放堆内存)。但是,这种程序结构存在一定的隐患,比如在子线程中使用了sleep函数时,主线程中即便是将g_ExitThread设为FALSE,子线程也必须要等待sleep函数定时时间到才能退出。
比较简单和可靠的方式是在while(1)循环中使用WaitForSingleObject函数等待信号量。具体原理过于简单,这里就不再复述了,直接看其典型用法即可:
DWORD dw = WaitForSingleObject(p_Dlg->h_ExitEvent, 10000); //等待一个进程结束
switch (dw)
{
case WAIT_OBJECT_0:
// 在等待超时之前信号量置位
strtemp = "信号量置位,子线程退出\r\n";
p_Dlg->m_ctrEdit.SetSel(-1, -1);
p_Dlg->m_ctrEdit.ReplaceSel(strtemp);
p_Dlg->SendMessage(WM_THREADMESSAGE,0,0);
return 0;
break;
case WAIT_TIMEOUT:
// 等待超时
strtemp=tm.Format("[%Y年%m月%d日 %X]信号量无效,子线程等待超时\r\n");
p_Dlg->m_ctrEdit.SetSel(-1, -1);
p_Dlg->m_ctrEdit.ReplaceSel(strtemp);
p_Dlg->SendMessage(WM_THREADMESSAGE,0,0);
break;
case WAIT_FAILED:
// 传入的信号量句柄无效
strtemp = "传入信号量句柄无效\r\n";
p_Dlg->m_ctrEdit.SetSel(-1, -1);
p_Dlg->m_ctrEdit.ReplaceSel(strtemp);
p_Dlg->SendMessage(WM_THREADMESSAGE,0,0);
return 0;
break;
}
要实现主线程控制子线程退出,需要考虑到子线程的响应速度和用户堆内存的泄露问题。一般来说,子线程的主体部分是一个while(1)循环。
最简单也是最直观的办法是采用全局变量,如在主对话框类头文件中定义一个static BOOL g_ExitThread;子线程程序主体改写为while(g_ExitThread);然后在该循环之外做好收尾工作(释放堆内存)。但是,这种程序结构存在一定的隐患,比如在子线程中使用了sleep函数时,主线程中即便是将g_ExitThread设为FALSE,子线程也必须要等待sleep函数定时时间到才能退出。
比较简单和可靠的方式是在while(1)循环中使用WaitForSingleObject函数等待信号量。具体原理过于简单,这里就不再复述了,直接看其典型用法即可:
DWORD dw = WaitForSingleObject(p_Dlg->h_ExitEvent, 10000); //等待一个进程结束
switch (dw)
{
case WAIT_OBJECT_0:
// 在等待超时之前信号量置位
strtemp = "信号量置位,子线程退出\r\n";
p_Dlg->m_ctrEdit.SetSel(-1, -1);
p_Dlg->m_ctrEdit.ReplaceSel(strtemp);
p_Dlg->SendMessage(WM_THREADMESSAGE,0,0);
return 0;
break;
case WAIT_TIMEOUT:
// 等待超时
strtemp=tm.Format("[%Y年%m月%d日 %X]信号量无效,子线程等待超时\r\n");
p_Dlg->m_ctrEdit.SetSel(-1, -1);
p_Dlg->m_ctrEdit.ReplaceSel(strtemp);
p_Dlg->SendMessage(WM_THREADMESSAGE,0,0);
break;
case WAIT_FAILED:
// 传入的信号量句柄无效
strtemp = "传入信号量句柄无效\r\n";
p_Dlg->m_ctrEdit.SetSel(-1, -1);
p_Dlg->m_ctrEdit.ReplaceSel(strtemp);
p_Dlg->SendMessage(WM_THREADMESSAGE,0,0);
return 0;
break;
}
- MFC控制子线程退出的基本思路比较
- MFC 线程的退出方法
- MFC子线程向主线程SendMessage或者直接操作UI时可能导致子线程的退出异常
- 采用事件内核对象(Event)控制子线程的退出
- MFC 主线程等待子线程退出函数
- C#采用线程处理文档的基本思路
- MFC 子线程消息循环的实现
- [MFC]获取线程退出码
- 在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考
- 关于mfc线程 的退出问题、同步问题
- MFC子线程
- C# WinForm 多线程 应用程序退出的方法 结束子线程
- 关于app退出后子线程停止的问题
- 主线程、子线程与进程的退出问题
- MFC线程控制
- 控制线程(NSThread)和运行时循环(NSRunLoop)的退出
- 控制线程(NSThread)和运行时循环(NSRunLoop)的退出
- 父线程用标志变量控制子线程的范例
- Android Notifications通知
- Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastor
- Windows 强制删除文件及文件夹命令
- MySql数据库的列类型(字段类型)
- RHEL 5 建立YUM 安装仓库
- MFC控制子线程退出的基本思路比较
- android 调用指定浏览器
- 鸿海碳纳米管触控面板或华为、酷派等采用
- 用newlisp管理windows下的nginx
- tomcat javaweb开发基础(10servlet(3))
- Android SDK版本与Apk-Api级别的对应关系
- 漫画HDFS
- PHPExcel中open_basedir restriction in effect的解决方法
- HTML5离线应用