积极答复者
结束一个Sleep的线程

问题
-
一个简单的界面上就2个按钮:开始和结束;开始按钮是开启线程,结束按钮是关闭线程。大概代码如下:
BOOL g_flag=FALSE; UINT test(LPVOID pParam) { while(true) { // 方案一 if(g_flag) return 1; // 方案一 …… ::Sleep(10000); } return 1; } CWinThread *m_pThread=NULL; void Ctest线程死循环Dlg::OnBnClickedStart() { // TODO: 在此添加控件通知处理程序代码 if(!m_pThread) m_pThread=AfxBeginThread(test,this); else ::AfxMessageBox(_T("正在运行中,请稍等!")); } void Ctest线程死循环Dlg::OnBnClickedStop() { // TODO: 在此添加控件通知处理程序代码 // 方案一 if(m_pThread) { g_flag=TRUE; } //方案二 if(m_pThread) { ::TerminateThread(m_pThread->m_hThread,0); m_pThread=NULL; } }
方案一处理的话,线程不会实时关闭,必须要到Sleep函数执行完毕才能通过关闭线程。但是是安全的,线程会销毁线程资源。
方案二处理的话,线程能够实时关闭,但是不安全,线程资源不会销毁。 (资源释放与否是通过查看任务管理器中程序的内存使用)。
有没有既安全又实时的结束线程方案?
各位朋友发表下自己的想法,谢谢!
答案
-
Sleep是不能被中断的
你需要对你的程序重新设计
但是这个Sleep是在一个线程里面的,结束掉线程就可以了。我的问题是出在怎么样安全结束线程?而且是一个处在Sleep的线程。TerminateThread固然可以,但是内存泄漏严重。没有什么更好的办法
至少我不清楚
线程最安全的结束方式就是自己结束
可是sleep一旦启动就不会被停下来
更何况你的sleep还是在线程里
- 已标记为答案 abin's life 2010年11月3日 7:15
全部回复
-
Sleep是不能被中断的
你需要对你的程序重新设计
但是这个Sleep是在一个线程里面的,结束掉线程就可以了。我的问题是出在怎么样安全结束线程?而且是一个处在Sleep的线程。TerminateThread固然可以,但是内存泄漏严重。没有什么更好的办法
至少我不清楚
线程最安全的结束方式就是自己结束
可是sleep一旦启动就不会被停下来
更何况你的sleep还是在线程里
- 已标记为答案 abin's life 2010年11月3日 7:15
-
Terminate thread is dangerous, may cause your application to have unpredictable behavior, for instance, if the to-be-terminated thread is allocating memory and has acquired the lock, then, the future heap allocation will be broken, also the resource reclamation also has the problem.
Sleep cannot be interrupted, but SleepEx can be. But anyway, this is not a good way. Consider other good threads coordination method.