高手请进,解决问题者,重分,up有分:SDI界面,退出时如何关闭线程不出错,绝对给分

danielzhu 2003-03-26 02:59:05
我的程序是一个SDI界面,启动后,通讯线程一直在后台工作,当用户退出时可以选择菜单中退出命令退出,也可以点击有上角的小叉退出,或者Alt+F4,我这时应该怎样截获这个消息,又如何通知线程并关闭他。
望各位能有源码提供......
...全文
90 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
o_racle 2003-04-21
  • 打赏
  • 举报
回复
up
zyylikeeating 2003-04-15
  • 打赏
  • 举报
回复
我也用得TerminateThread
不过总觉得心里不踏实
感觉不知什么时候就挂了
可又不知道别的方法
楼上几位讨论的都看不大懂
不知道那位老大有源代码放上来打家学习一下
danielzhu 2003-03-31
  • 打赏
  • 举报
回复
现在我的程序的DEBUG版本可以运行,但是RELEASE版本致命错误,我将尝试 Daniel22_cn的方法,谢谢(Daniel)
Tommy 2003-03-30
  • 打赏
  • 举报
回复
我也遇到了这个问题。我看楼上都介绍在设置一个标志(用全局量或者信号量)后,用WaitForSingleObject等待线程结束。这种做法有一点问题,如果要结束的线程需要一段时间才可以退出的话,主线程由于正在WaitForSingleObject中,无法进行消息处理,在用户看来就是已经死掉了,如果心急的用户可能就会用三键关程序了,我就遇到过这样的事:)

我后来的做法是,主线程收到WM_CLOSE后,如果子线程还在运行就先不退出,而是设置一个标志,说明是在退出状态,并通过子线程退出。子线程在退出时,在最后向主线程发送一条消息,主线程收到该消息后,才真正的退出。这样,在等待期间窗口还是有响应的,给用户一个好的感觉。

另外,由于我的线程都是进行网络操作的,为防子线程阻塞在Socket中,我还会在主线程中关闭Socket,让子线程马上从Socket中退出来。
o_racle 2003-03-30
  • 打赏
  • 举报
回复
up
imzxr 2003-03-29
  • 打赏
  • 举报
回复
用TerminalThread()好像可以结束被阻塞的线程,我就是这么用的。
Daniel22_cn 2003-03-29
  • 打赏
  • 举报
回复
你做的东西我已经完成了,我在CWinApp中启动线程监听12345端口,支持udp/tcp连接。

在接受到消息时创建另一个线程显示和发出声音。

我使用一个数组保存已经启动线程,使用了一个全局变量作为标志。监听如果发现该标志则退出当前的会话,并且返回。在CMainFrame的OnClose中检查线程是否已经退出。

ExitFlag = 0x01;//退出标志
int i;
if(WaitForMultipleObjects(
MAX_THREADS,
hThreads, //这是保存线程Handle的数组
TRUE,
10000 )==WAIT_TIMEOUT)//等待10秒种
for(i=0;i<MAX_THREADS;i++)
TerminateThread(hThreads[i],0x01); //强制退出,设退出标志为1
CFrameWnd::OnClose();

有问题,可以继续问,因为我刚好做到这个课题 :p
yaogreat 2003-03-29
  • 打赏
  • 举报
回复
同意“studying c#”兄的做法。
imzxr 2003-03-27
  • 打赏
  • 举报
回复
同意Tasehouny(阿甘)的做法,一定要等到子线程结束后,主窗体才可以关闭,否则必定报错。
Tasehouny 2003-03-27
  • 打赏
  • 举报
回复
工作者线程一样的可以设置 事件啊!

不用全局变量一样可以的!
netxy 2003-03-27
  • 打赏
  • 举报
回复
global variable...>_<
peterretep 2003-03-27
  • 打赏
  • 举报
回复
各位,搂住的通讯线程可能是一个工作者线程,这时候PostThreadMessage可能就没用了
flyycyu 2003-03-27
  • 打赏
  • 举报
回复
up
wangzif 2003-03-27
  • 打赏
  • 举报
回复
也凑个问题:如过线程函数中有个阻塞函数在运行,强制结束该线程(TerminalThread())该阻塞函数也能被结束么?好像不能。如何解决?
danielzhu 2003-03-27
  • 打赏
  • 举报
回复
线程编程未入门,还有很多,我都不懂,希望提供多线程的源代码

WaitForSingleObject(m_pWinThread.m_hThread,TIMEOUT);
ZouMorn 2003-03-27
  • 打赏
  • 举报
回复
本人正在做一个相同的洞洞:

OnNewDocument()

CYourDocument::m_pWinThread=AfxBeginThread(...);

OnCloseDocument()
Set a global flat to force thread to exit.
WaitForSingleObject(m_pWinThread.m_hThread,TIMEOUT);


jiadrun 2003-03-27
  • 打赏
  • 举报
回复
监听WM_DESTROY或WM_CLOSE消息
然后:SetEvent(hEvent)使某事件对象有信号

线程中检测到hEvent有信号时break便OK了。这种方法安全性最好。

另一种办法是采用:TerminateThread(....)这种方法不安全,建议不用。
SeekTruth 2003-03-26
  • 打赏
  • 举报
回复


向楼上的学习啊。
Tasehouny 2003-03-26
  • 打赏
  • 举报
回复
flyelfsky(elf) 的做法比较标准些


通常的做法是设置一个事件, 在线程的ExitInstance 中设置这事件,主线程等待这个事件,如果有多个线程,最好是这样处理。

在WaitForSingleObject 成功后,最好再调用 Sleep(1000) 休息一会而,因为有可能你的主线程比子线程退出的还快,在 SetEvent的时候,子线程并没有完全退出。
flysundy 2003-03-26
  • 打赏
  • 举报
回复
up
加载更多回复(9)

15,467

社区成员

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

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