关于work线程与UI线程同步的问题

夜行人 2013-08-31 10:21:23
简单描述一下:

程序中有些连续性的动作会执行很长时间,在此期间界面会卡死,所以开了个线程去执行,但是在执行过程中如果用户关闭了UI窗口,怎么办?

简单分析如下:
1.UI线程等待work线程结束后再结束自己,但是work线程执行的任务有可能时间过长,这位就造成用户选择了关闭,界面有过很长时间才会响应,不可取。
2.UI线程结束时调用TerminateThread结束子线程,可以是可以,不过会造成大量内存泄漏,不可取。
3.UI线程直接退出,让work线程正确执行完成自动退出,这个方法是大家比较提倡的,可是问题随之而来,work线程里要大量地访问UI线程里的资源,如果UI线程一旦退出,就会崩掉。最后我试着用了些全局变量,问题是改善了一些,但是不可能所有资源全部定义成全局的,有什么改善方法吗?
4.还有什么其他的思路吗?

恭候大牛赐教。
...全文
904 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hannah_zzz 2013-09-23
  • 打赏
  • 举报
回复
同1楼的做法 我的多线程程序也是这么来编写的
oyljerry 2013-09-21
  • 打赏
  • 举报
回复
把耗时任务拆分,这样可以提高检测频率 其次,可以让UI先隐藏,等worker真正退出了,再释放UI香港
路人乙2019 2013-09-21
  • 打赏
  • 举报
回复
可以先隐藏ui再等待workthread.
lm_whales 2013-09-21
  • 打赏
  • 举报
回复
关键是work线程可能执行一件任务就会花很长时间,如何让它在执行任务期间就去检测变量呢? 这个任务可以切成小块,
lm_whales 2013-09-21
  • 打赏
  • 举报
回复
可以通过线程参数通讯呀?????
fishion 2013-09-02
  • 打赏
  • 举报
回复
用一个全局的线程退出标志,然后在线程中要运行长时间的操作用多设置几个地方来判断这个标志
Eleven 2013-09-02
  • 打赏
  • 举报
回复
最好是UI线程等待工作线程退出以后再结束~
神-气 2013-09-02
  • 打赏
  • 举报
回复
引用 4 楼 yugnahz 的回复:
[quote=引用 3 楼 ADF1230 的回复:] work线程不能退出吗 ? 既然UI被关掉了,说明用户不想再使用work线程了啊。那这样,work线程就该立即退出啊。 UI关掉的时候设置work线程exit变量为true,work线程监测到exit变量为true后清理相关资源立即退出。
关键是work线程可能执行一件任务就会花很长时间,如何让它在执行任务期间就去检测变量呢?[/quote] 一般线程是这样检查: while(!m_bExit) { //do something } 如果你每一次执行时间都很长的话,隔一段代码就检测一下m_bExit,或者直接强制结束线程好了,一般UI关掉了好像进程也要退出了吧,不存在泄露的问题,操作系统会回收。
xiaohutushen30 2013-09-02
  • 打赏
  • 举报
回复
工作者线程中,每进入到耗时的部分前和后都进行一次检测!最好把耗时特别长的代码分段写,分成多个耗时段!
  • 打赏
  • 举报
回复
其实不麻烦的啦 你只要在work线程里偶尔sleep个100ms就能解决UI卡顿的问题了
夜行人 2013-09-01
  • 打赏
  • 举报
回复
引用 3 楼 ADF1230 的回复:
work线程不能退出吗 ? 既然UI被关掉了,说明用户不想再使用work线程了啊。那这样,work线程就该立即退出啊。 UI关掉的时候设置work线程exit变量为true,work线程监测到exit变量为true后清理相关资源立即退出。
关键是work线程可能执行一件任务就会花很长时间,如何让它在执行任务期间就去检测变量呢?
神-气 2013-09-01
  • 打赏
  • 举报
回复
work线程不能退出吗 ? 既然UI被关掉了,说明用户不想再使用work线程了啊。那这样,work线程就该立即退出啊。 UI关掉的时候设置work线程exit变量为true,work线程监测到exit变量为true后清理相关资源立即退出。
蒋晟 2013-08-31
  • 打赏
  • 举报
回复
界面线程设置退出事件状态并开始等待已退出事件状态 工作线程在循环时定时检测退出事件状态,如果检测到则退出循环并设置已退出事件状态 界面线程设置等待到已退出事件状态或者等待超时,销毁窗口

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧