社区
进程/线程/DLL
帖子详情
高手请进,解决问题者,重分,up有分:SDI界面,退出时如何关闭线程不出错,绝对给分
danielzhu
2003-03-26 02:59:05
我的程序是一个SDI界面,启动后,通讯线程一直在后台工作,当用户退出时可以选择菜单中退出命令退出,也可以点击有上角的小叉退出,或者Alt+F4,我这时应该怎样截获这个消息,又如何通知线程并关闭他。
望各位能有源码提供......
...全文
90
29
打赏
收藏
高手请进,解决问题者,重分,up有分:SDI界面,退出时如何关闭线程不出错,绝对给分
我的程序是一个SDI界面,启动后,通讯线程一直在后台工作,当用户退出时可以选择菜单中退出命令退出,也可以点击有上角的小叉退出,或者Alt+F4,我这时应该怎样截获这个消息,又如何通知线程并关闭他。 望各位能有源码提供......
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
链接:MSDN UserNet等
T可塌陷的PanelBar
界面
比outlookbar更有吸引力,Windows XP左边的导航工具面版就是采用这种风格,采用这种风格的应用程序也越来越多,比如各种杀毒软件,可能delphi提供的vcl组件可以简化这种操作,对于这种“傻瓜式...
VC6.0转成VC2008可能出现的问题
9月23日BcgControlbar是个好东西——
界面
用 解压缩 BCGControlBar.zip (比如,到 c:/bcg 目录中) 把 c:/bcg/bin 增加到你的 path 环境变量中, 运行 Visual C++ 并且打开 Tools | Options 对话框...
CSDN回帖得
分
大全(近两年)
√vs2005调用dll的
时
候Initialize()函数返回错误 [VC/MFC ... [VC/MFC
界面
] 40 chencheng8095 05-23 00:2911 xianglitian06-10 11:51管理√CFileFind::FindFile 支持通配符么? [VC/MFC 基础类] 100 wysbk002 05-22
vc开发工作小结
一隐藏任务条上的图标第一、创建对话框
时
必须将它作为某个不可见框架窗口的子窗口;第二、这个不可见框架窗口的扩展式样必须设置 WS_EX_TOOLWINDOW;第三、保证对话框的扩展式样没有设置 WS_EX_APPWINDOW; 先在...
VC++ 知识小结(续)
1)当文档被修改
时
,如何在标题上加上标志'*'?重载CDocument类的虚函数virtual SetModifiedFlag: void CTest2Doc::SetModifiedFlag(BOOL bModified){CString strTitle = GetTitle();CString strDirtyFlag = " *"; //...
进程/线程/DLL
15,467
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章