功能描述:最近写了一个字符串搜索程序,搜索结果用线程(调用AddString)输出到UI(一个CListBox的窗口).
问题描述:当遇到输出结果非常多(比如几十万条)的情况下,用户关闭程序后线程依然会执行很久(当然这种执行是没有必要的).而且线程中有delete的释放内存操作,如果异常中止就会导致内存泄漏。目前我的一个想法是在主线程退出时调用PostThreadMessage,给线程发送消息,线程接收到消息后就停止当前的输出操作,释放堆内存后退出。但我没用过这个API,不大确定它是否能行得通。现在请教一下各位高手有没有一个妥善的方法让线程在主程序关闭后安全且快速地退出。PostThreadMessage这个方案是否是可行的呢?希望大家能给点意见。谢谢!
问题描述:当遇到输出结果非常多(比如几十万条)的情况下,用户关闭程序后线程依然会执行很久(当然这种执行是没有必要的).而且线程中有delete的释放内存操作,如果异常中止就会导致内存泄漏。目前我的一个想法是在主线程退出时调用PostThreadMessage,给线程发送消息,线程接收到消息后就停止当前的输出操作,释放堆内存后退出。但我没用过这个API,不大确定它是否能行得通。现在请教一下各位高手有没有一个妥善的方法让线程在主程序关闭后安全且快速地退出。PostThreadMessage这个方案是否是可行的呢?希望大家能给点意见。谢谢!
解决方案 »
- MFC对话框 windows服务 在线等
- 请问哪个函数可以判断某一个路径的可执行文件是否在运行
- 如何在VC++ 2005中MFC中的SDI页面中加入flash元素
- VC6怎么调用dll文件?
- 高分求免费免费的空间,
- MFC程序中,什么时候运行到CWnd::Default() ??请大概示例一下它的流程
- 我的工程是继承自CListView里,现在我想在一个对话框中对ListView进行操作,该如何呢?
- 用过Mcirosoft FlexGrid Control Version 6.0这个控件请进?
- 关于制作小于1ms级精度定时器的问题,请高手指点,急。。。。。。。。。
- vc++6.0 中,多个线程利用 ADO 如何同时访问数据库,并进行更改记录操作。
- 线程同步问题,各位大大帮帮忙
- 关于双核CPU的WINDOWS系统管理
应该 可行。
也就是说你只是开一个工作线程,在里面调用AddString,但这个函数相当于给主线程的窗口发送控件消息,实际上还是在主线程里运行!最好是给主线程窗口Post一个自定义消息,让主线程来更新界面。使用一个全局变量
long volatile g_lExit = 0;启动时置0,在程序退出前将其值置为1通知线程终止,然后调用WaitForSingleObject函数等待线程句柄。线程函数里每次循环都检测它声明为volatile型可以避免编译器对其优化致使不能读取新值
主界面响应仍然可能不会很及时,会延迟
1是设置若干共享变量用于表示主线程和工作线程的状态,主线程和工作线程就通过查看这些共享变量进行同步。主线程直到成功通知工作线程结束后才会退出。
2是主线程在退出时向工作线程post一条信息后立即退出。工作线程在自己的循环体内调用获取消息的API,收到对应消息后主动退出。但由于我目前还没实现它们,不知道主程序退出后,线程的消息队列是否还会被系统继续保留,这方面欢迎高手们赐教。
再次谢谢大家!
不是一个好方法,这可能和直接退出没什么区别,因为如果主线程退出时进程也终止了,工作线程将被强迫终止,这样它来不及做应做的清理工作,C++类对象将得不到析构,...
主线程要调用等待函数等到线程句柄后再退出,这样才能确保工作线程先正常结束