多线程中主程序退出时,别的线成还在while(TRUE)中怎么办呀? 主线程有个不好的习惯,就是喜欢同归于尽,它在退出时就会调用ExitProcess来结束整个进程。你用同步机制处理一下吧,三言两语说不清楚,自己看看书问问人吧。我只会一点点啦,不要问我。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用一个全局变量,就能搞定。在置值后,主线程sleep几秒就能ok了。 比较简单的方法是为每个线程传递一个bool参数,在while循环中检查这个bool参数,如果为false就退出while(true),但这样你就必须保持一个bool参数和线程句柄的列表,比较好的方法是使用同步机制,可以用event或其它的同步方法,不过你要有一定的同步方面的知识,可以参看一些操作系统方面的书 to james_razor(蹬三轮的)这样有什么理论根据吗?大家帮我看一下上面的服务器端监听程序.当我在主线程里调用WSACleanup()函数后,好像执行不到break语句了. 理论?哪儿有,书上有?书上可不会说这些边边角角的细节(有我也没看到过),我只知道如果主线程成功调用了ExitProcess,所有其它的线程就无疾而终了。到是因为其他的原因如:一个线程将变量过早释放,而其它线程仍试图访问造成的非法操作。当然这只是同步的问题。 谢谢james_razor(蹬三轮的)了,通过我上午的调试觉得你讲的是对的了,呵呵.如果在退出的时候我不管监听线程(让主线程退出就行了)没什么问题,如果加入一些同步机制反而执行不到,老出现非法操作.哎.........有时候还识别想得太多:) 同步问题是个大问题,许多资深的程序员还往往为此所困,《Windows高级编程》的作者Jeffery Richter你该知道吧,他也承认他在第二版的《Windows高级编程》中的一个程序有同步的错误,在第三版才做了修正,所以这些问题要靠扎实的理论基础和丰富的实际经验来解决,缺一不可,即使是这样,也不能保证完全没有问题。我没到这种境界,所以我的程序老出问题(要不然也不会靠蹬三轮糊口,呵呵)。 kao ,抢我生意绝对不行! 我看不太懂,但我觉得你不用CSokcet类,而用CAsyncSocket就不需要多线程了。 你在退出主线程前,可以通过调用GetExitCode()查看线程是否退出,如果没有退出就调用ExitThread() 或 TerminateThread() 强制退出线程。应当不要用到同步问题 争得好热闹啊。我觉得lu_zi和james_razor说得都对! 我也是新手,我说说我的理解吧:在windows下,一个程序启动后,windows会为其创建一个进程和一个主线程,这个主线程就是你程序的入口函数,程序的启动会执行c++的运行库启动函数,启动函数初始化后才调用你程序的入口函数,入口函数执行完后会返回给c++运行库启动函数的代码,它做一些清除工作并且调用ExitProcess,撤销你的进程,ExitProcess被调用时你程序中所有的进程都会被撤销,这也是为什么主线程函数执行完后会撤销所有线程的原因,但是如果你的入口函数中调用了ExitThread函数(vc++提供有自己的支持函数_endthreadex只不过做了一些附加的工作),你的主线程会终止运行,但是其它线程可以照常工作(不过ExitThread会撤销主线成的堆栈,如果其它线程访问到主线程得堆栈的话,也会产生异常),进程不会终止,直到所有线程都退出才会被撤销。所以我觉得如果上面的代码是在你程序的入口函数中被调用的话,你的程序在其他线程终止之前不会撤销,不过这样做会造成问题,因为你主线程因为_endthreadex推出后,c++运行时库启动代码不会再次获得控制,不能完成清理工作,有可能会造成问题。 同意lu_zi的。设个全局bool变量。线程们都判断它。主线程退出前,设bool变量为true然后一直while到所有 线程 都退出了。 我的鼠标钩子过程函数为什么只执行一次呢? 根据数据绘制曲线 如何根据选择的字体将字符转换成点阵图像 如何显示滚动的文字 错误提示 local function definitions are illegal 什么意思? 如何得到 打开--〉浏览文件的文件路径及文件名 多文档结构,Doc怎么访问App的数据? 预编译有个啥子用罗 怎样关闭运行中的所有程序 请问如何在VC中实现分割窗口?分割以后的窗口可以拖动改变大小,就像VC的IDE环境一样 请问各位,当我要用到另一个类时,用#include包含 与用class声明 的方法有什么不同 VC控件编程中为何要用长字符串
大家帮我看一下上面的服务器端监听程序.当我在主线程里调用WSACleanup()函数后,好像执行不到break语句了.
在windows下,一个程序启动后,windows会为其创建一个进程和一个主线程,这个主线程就是
你程序的入口函数,程序的启动会执行c++的运行库启动函数,启动函数初始化后才调用你程序
的入口函数,入口函数执行完后会返回给c++运行库启动函数的代码,它做一些清除工作并且
调用ExitProcess,撤销你的进程,ExitProcess被调用时你程序中所有的进程都会被撤销,这也是为什么主线程函数执行完后会撤销所有线程的原因,但是如果你的入口函数中调用了ExitThread函数(vc++提供有自己的支持函数_endthreadex只不过做了一些附加的工作),你
的主线程会终止运行,但是其它线程可以照常工作(不过ExitThread会撤销主线成的堆栈,如果其它线程访问到主线程得堆栈的话,也会产生异常),进程不会终止,直到所有线程都退出才会
被撤销。所以我觉得如果上面的代码是在你程序的入口函数中被调用的话,你的程序在其他线程
终止之前不会撤销,不过这样做会造成问题,因为你主线程因为_endthreadex推出后,c++运行时
库启动代码不会再次获得控制,不能完成清理工作,有可能会造成问题。
设个全局bool变量。线程们都判断它。主线程退出前,设bool变量为true
然后一直while到所有 线程 都退出了。