MFC 如何在主线程中判断子线程是否运行,运行则关闭子线程?

如题所述

还没弄好?之前和你说过了,其实就是WaitForSingleObject和CEvent,对于MFC,使用Afx方式创建线程有系列的方法可用,只要你保存了这个指针或句柄。

给你找了一段例程序,这里包含了判断和外部结束的全部方法,你不一定要创建这个类,只要保留CWinThread指针即可。

class CScrCapThread : public CWinThread
{
CEvent  m_eventKill;
CEvent  m_eventDead;
static CEvent  m_eventAnotherDead;
BOOL  IsKilling();
BOOL  IsDead();
void KillThread();
virtual void Delete();
}
CScrCapThread::CScrCapThread()
:m_eventKill(FALSE,TRUE)
,m_eventDead(FALSE,TRUE)
{
m_bAutoDelete=FALSE;
}
BOOL CScrCapThread::IsKilling()
{
return ::WaitForSingleObject(m_eventKill,0)==WAIT_OBJECT_0;
}

BOOL CScrCapThread::IsDead()
{
return ::WaitForSingleObject(m_eventDead,0)==WAIT_OBJECT_0;
}
void CScrCapThread::Delete()
{
// calling the base here won't do anything but it is a good habit
CWinThread::Delete();
// acknowledge receipt of kill notification
VERIFY(m_eventDead.SetEvent());
VERIFY(m_eventAnotherDead.SetEvent());
}
void CScrCapThread::KillThread()
{
// Note: this function is called in the context of other threads,
//  not the thread itself.
// reset the m_hEventKill which signals the thread to shutdown
VERIFY(m_eventKill.SetEvent());
// allow thread to run at higher priority during kill process
SetThreadPriority(THREAD_PRIORITY_ABOVE_NORMAL);
WaitForSingleObject(m_eventDead, INFINITE);
WaitForSingleObject(m_hThread, INFINITE);
// now delete CWinThread object since no longer necessary
if(m_bAutoDelete)
delete this;
}

追问

这段代码没看懂,是关闭线程时调用KillThread()函数就可以了吗?

追答

这个代码看不懂。。。。只能认真再看了,不难。
当然不是KillThread,这个是自定义函数,没看到代码中的函数实现么。

追问

m_hThread 是线程句柄? 在线程中设置::SetEvent(m_hThread);吗?

追答

m_hThread 首先是CWinThread类成员,就是本类线程句柄。

THREAD_PRIORITY_ABOVE_NORMAL是结束线程的关键。

追问

判断语句,是IsDead吧
SetThreadPriority(****,THREAD_PRIORITY_ABOVE_NORMAL);
第一个参数是什么?
delete this;是干嘛用的,用了程序终止了

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-04-10
简单的办法:
设置一个两个线程都可以访问的变量 ,如volatile bool bRunFlag;
当子线程开始运行时,则设置bRunFlag = true;
则可以判断子线程是否在运行。

关闭子线程
bRunFlag = false ;
WaitForSingleObject(threadHandle,INFINITE);
close(threadHandle);追问

用不了close()

追答

closehandle

sorry 少输入了几个

追问

用了这个子线程是关闭了,但是我想要的是关闭这个再创建一个线程,很无语,不知道怎么办?

还有在哪使用SetEvent();?

本回答被网友采纳

MFC 如何在主线程中判断子线程是否运行,运行则关闭子线程?
给你找了一段例程序,这里包含了判断和外部结束的全部方法,你不一定要创建这个类,只要保留CWinThread指针即可。class CScrCapThread : public CWinThread{CEvent m_eventKill;CEvent m_eventDead;staticCEvent m_eventAnotherDead;BOOL IsKilling();BOOL IsDead();voidKillThread();virtual void Delete...

MFC编程,如何得知一个进程活着线程是否退出
添加对WM_CLOSE消息的处理代码就可以知道程序什么时候要关闭了。写文件的时候系统不直接把内容写到文件中的而是放在系统缓冲区中。系统会在你关闭文件的时候再把缓冲区中的内容写到文件中,你也可以手动把缓冲区中的内容“更新”到文件中 可以使用以下函数 c函数 fflush()c++SDK函数FlushFileBuffers()C++ C...

为什么mfc主线程执行结束后才执行子线程
一个程序从入口函数开始运行,知道运行到末尾的 return结束,程序退出。这是一个很正常的过程,如果你不告诉程序停止向下执行语句,他会始终向下执行直到return。等待事件一般就可以停止运行代码,但是最好不要写在主线程里,容易引起关闭时候不正当现象。一般windows窗口程序为什么不会有楼主这问题呢,因为窗口...

如何使“主线程”等待“子线程”执行结束后再继续执行
{ Thread.sleep(10);[color=#00FF00]当子线程没有执行完毕,就让主线程等待}[\/color]...如果不设置标记判断 而是直接让主线程 Thread.sleep(xxx)睡眠是不合理的。原因是:由于主线程和子线程是并发运行的 睡眠的时间不好控制 如果时间太短 可能子线程没有运行完主线程就又开始运行了。如果时间太...

如果子线程阻塞,怎么正常退出子线程
这个Function在某种极端的,原因不明的情况下会发生阻塞。为了恢复正常我需要关闭并新建一个线程。---解决方案---线程应该设置正常的出口条件吧?如果被某个操作阻塞了,而又想提前结束,似乎只有强杀。---解决方案---只能强杀 ---解决方案---你没有...

如何正确的关闭 MFC 线程
设置一个标记变量或者用一个事件信号,在线程的while循环中检测这个变量是否退出,然后决定是否结束循环。

MFC 如何在退出时执行某段代码
右键点建立类向导,弹出如图对话框:选WM_CLOSE或DestroyWindow(二者区别请上网搜索),点AddFunction,类向导会自动给你添加成员函数,在Member functions里选择刚才的成员函数,进入代码编辑,加入你杀死线程的代码。

MFC中如何通过点击主程序的stop按钮来终止子线程?
需要改动一下上面的程序,在调用AfxBeginThread时把此函数返回的CWinThread*变量保存起来,比如定义一个类成员变量CWinThread* m_pThread,调用AfxBeginThread的代码改成m_pThread= AfxBeginThread(ThreadRun,this);。而Stop里的代码可以写成:DWORD dwCode;GetExitCodeThread(m_pThread->m_hThread, &dwCode...

MFC多线程主线程和新建线程执行关系
首先强调一点:你这里有主线程和和新建线程,它们都存在于你这个程序的进程里,这个问题没涉及主进程、子进程什么的,进程和线程的概念千万别弄混。即使新建线程没用Sleep函数,界面照样不能即时响应新建线程更新界面的操作。Windows的线程可分为UI线程和工作线程,主线程是UI线程,负责一切响应用户输入和绘制...

代码中如何保证子线程崩溃时,主线程依旧正常工作
\/\/开启线程2 t2.start();Thread t3=new Thread(){ public void run(){ System.out.println("子线程3");ThreadTest.i+=1;} };\/\/开启线程3 t3.start();boolean res=true;while(res){ \/\/这里判断子线程是否运行完了 if(ThreadTest.i==3){ System.out.println("主线程结束");res=...

相似回答