程序退出后,进程还在 怎么处理???

ponydph 2014-03-12 10:43:11
主程序 运行时 同时开了4-5个线程,在退出的时候,先设置退出标志,
然后在子线程循环中 判断标志。如果成立,则设置退出事件有信号状态,

但是程序退出后,进程中还存在,观察退出日志,仍有线程没有来得及执行 主程序就退出了。
但线程还在,请问有什么好的办法没有。

子线程处理过程
void ProcThread1()
{
while(true)
{
if(退出标志成立)
break;
}

SetEvent(信号比标志)
}

主程序关闭函数
CMainFrame::OnClose()
{
WaitForSingleObject(信号标志,2000);
}
...全文
5168 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
ponydph 2014-05-02
  • 打赏
  • 举报
回复
引用 36 楼 unearth 的回复:
做个提示框,就显示 “程序正在关闭,请稍候。。。”,直接所有子进程关闭,再关闭主进程。
这个只是等待标志,现在是MDI 程序 点击关闭按钮后,由于线程退步出来,(正在执行某项操作),导致界面不动,一直在哪里等待,一直到子线程退出,才退出。
孤独de猫 2014-04-30
  • 打赏
  • 举报
回复
做个提示框,就显示 “程序正在关闭,请稍候。。。”,直接所有子进程关闭,再关闭主进程。
ponydph 2014-04-14
  • 打赏
  • 举报
回复
引用 34 楼 unearth 的回复:
流程是 : 等待所有线程退出,然后再关闭主进程。你所谓的关闭,只是把一个窗体关闭,而并没有把主进程关闭。主进程没有关闭,有可能是线程没有正常退出,或者是主进程在关闭时,有错误发生。导致程序没有按预期的流程走下去,建议使用断点,逐步,进行关闭前的调试下,应该能找出问题的。另外,线程的起动和 退出 在DEBUG模式下,建议使用Trace()。
程序不是每次都异常退出,而是在使用过程中,很多线程正在处理数据,突然退出导致的。 我通过写log日志的方法跟踪过,在主线程退出时,设定一个全局退出标志,有些线程不是按照设定的顺序退出的,比如某一个子线程需要等待结束标志,而另一个线程在等待的时候,不需要太多时间,反而先结束。
孤独de猫 2014-04-13
  • 打赏
  • 举报
回复
流程是 : 等待所有线程退出,然后再关闭主进程。你所谓的关闭,只是把一个窗体关闭,而并没有把主进程关闭。主进程没有关闭,有可能是线程没有正常退出,或者是主进程在关闭时,有错误发生。导致程序没有按预期的流程走下去,建议使用断点,逐步,进行关闭前的调试下,应该能找出问题的。另外,线程的起动和 退出 在DEBUG模式下,建议使用Trace()。
ponydph 2014-04-12
  • 打赏
  • 举报
回复
是的,中心思想是 当所有子线程都退出后,主线程才退出,否则强制退出,很多意外产生了。
90Runner 2014-04-09
  • 打赏
  • 举报
回复
写个批处理关闭的时候调用下
笑笑小懒猪 2014-04-09
  • 打赏
  • 举报
回复
建议看看windows 核心编程
kuankuan_qiao 2014-04-09
  • 打赏
  • 举报
回复
建议看看windows 核心编程
BeanJoy 2014-04-08
  • 打赏
  • 举报
回复
引用 23 楼 worldy 的回复:
只要有个线程在运行,你的进程就没有结束
这个说法有待商榷。 主线程退出,进程就退出了,其他子线程即使在运行,也会被强制结束掉。 PS:如果在任务管理器中也无法结束掉一个进程,那么这个进程可能正在与硬件打交道,无法立即响应,需等到操作硬件返回才能响应。
worldy 2014-04-08
  • 打赏
  • 举报
回复
只要有个线程在运行,你的进程就没有结束
ponydph 2014-04-08
  • 打赏
  • 举报
回复
引用 21 楼 worldy 的回复:
[quote=引用 20 楼 ponydph 的回复:] [quote=引用 17 楼 yaozhiyong110 的回复:] [quote=引用 15 楼 ponydph 的回复:] [quote=引用 14 楼 worldy 的回复:] 不用那么费事,线程中检测一个全局变量为True的时候,退出,这个无须使用同步对象
必须在主程序中退出,退出的时候还要左下一些收尾工作。[/quote] 主线程退出的时候 可以先把界面销毁 在后台sleep等待子线程运行结束再退出 至于你等20秒都没结束子线程只说明你子线程里面的操作太费时了 子线程应该尽量在处理业务的中间就判断下是否需要停止处理退出 比如你子线程不停写文件 一次写10G,那你应该每写10M就判断下是不是线程需要退出了...[/quote] 没有那么多费事的操作,无非是从队列取出数据,存到数据库中而已,我说的遗留的,而是任务管理器中遗留的线程。除非强行杀掉,否则自己i总不退出,不是时间长短问题。[/quote] 线程退不出来估计你控制有问题,一般线程都是在一个while无限循环,你只要给个条件为真时break,线程怎么可能会有残留?[/quote] 如果其他程序已经退出,每个线程等待5秒最多,但是设置条件后,在规定时间内,子线程没有来得及退出,岂不是要遗留了?
zmyouren1983 2014-04-08
  • 打赏
  • 举报
回复
碰到过,调用某人写的库一大堆,程序退出,进程还有,防多次启动总提示程序已经运行。当时没则每次启动在注册表记录进程ID,程序退出时注册表说明程序退出。重启时通过进程ID查找进程,如果应该结束,强制杀进程。
zcchm 2014-04-08
  • 打赏
  • 举报
回复
楼上的退出方式野蛮了点。 主线程还是要等待所有子线程结束后,再全身而退。
木有童年 2014-04-08
  • 打赏
  • 举报
回复
引用 26 楼 zhao4zhong1 的回复:
不要企图优雅的结束(因为这是不可能办到的:掉电、火灾、地震、海啸、核泄漏、地球毁灭、……)
但我们要尽量优雅的结束! 赵老师搬出了不可抗拒力来吓唬我们。。。
赵4老师 2014-04-08
  • 打赏
  • 举报
回复
不要企图优雅的结束(因为这是不可能办到的:掉电、火灾、地震、海啸、核泄漏、地球毁灭、……)
ponydph 2014-04-08
  • 打赏
  • 举报
回复
是的,因为在等待子线程退出的时候,不能无限期等待,设置了最长等待时间。 如果是无限期则 程序有可能是死在那里,不一定非的硬件操作,其它如操作数据库,文件关闭等。
worldy 2014-03-21
  • 打赏
  • 举报
回复
引用 20 楼 ponydph 的回复:
[quote=引用 17 楼 yaozhiyong110 的回复:] [quote=引用 15 楼 ponydph 的回复:] [quote=引用 14 楼 worldy 的回复:] 不用那么费事,线程中检测一个全局变量为True的时候,退出,这个无须使用同步对象
必须在主程序中退出,退出的时候还要左下一些收尾工作。[/quote] 主线程退出的时候 可以先把界面销毁 在后台sleep等待子线程运行结束再退出 至于你等20秒都没结束子线程只说明你子线程里面的操作太费时了 子线程应该尽量在处理业务的中间就判断下是否需要停止处理退出 比如你子线程不停写文件 一次写10G,那你应该每写10M就判断下是不是线程需要退出了...[/quote] 没有那么多费事的操作,无非是从队列取出数据,存到数据库中而已,我说的遗留的,而是任务管理器中遗留的线程。除非强行杀掉,否则自己i总不退出,不是时间长短问题。[/quote] 线程退不出来估计你控制有问题,一般线程都是在一个while无限循环,你只要给个条件为真时break,线程怎么可能会有残留?
ponydph 2014-03-20
  • 打赏
  • 举报
回复
引用 17 楼 yaozhiyong110 的回复:
[quote=引用 15 楼 ponydph 的回复:] [quote=引用 14 楼 worldy 的回复:] 不用那么费事,线程中检测一个全局变量为True的时候,退出,这个无须使用同步对象
必须在主程序中退出,退出的时候还要左下一些收尾工作。[/quote] 主线程退出的时候 可以先把界面销毁 在后台sleep等待子线程运行结束再退出 至于你等20秒都没结束子线程只说明你子线程里面的操作太费时了 子线程应该尽量在处理业务的中间就判断下是否需要停止处理退出 比如你子线程不停写文件 一次写10G,那你应该每写10M就判断下是不是线程需要退出了...[/quote] 没有那么多费事的操作,无非是从队列取出数据,存到数据库中而已,我说的遗留的,而是任务管理器中遗留的线程。除非强行杀掉,否则自己i总不退出,不是时间长短问题。
ponydph 2014-03-20
  • 打赏
  • 举报
回复
引用 16 楼 worldy 的回复:
辅助线程退出不等于主线程退出,你可以将所有的辅助线程句柄放到一个数组中, 主线程中使用 WaitForMultiObject(线程句柄数组) 让主线程等待所有的辅助线程都退出后,再让下执行,直到结束
我一般的思路是,建立子线程后,立即直接将句柄关闭掉,这好像是孙鑫老师讲的
fdsdfdsf 2014-03-18
  • 打赏
  • 举报
回复
抓一个dump分析一下
加载更多回复(17)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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