编写了一个多线程调用的程序。大概描述如下:
在对话框里开一个线程,调用一个封装在静态库里面的函数,该函数可执行一个无限循环的程序(比如循环抓包)。现在能不能用终止线程的方式让该循环程序停下来?
编写的代码如下:
void CWDlg::OnButton1()
{
//开线程;
AfxBeginThread(threadFunc,this->GetSafeHwnd(),THREAD_PRIORITY_NORMAL); }
UINT threadFunc(LPVOID param)
{
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
g_dlg->m_threadID = GetCurrentThreadId();
if( PeekMessage( &msg,0,WM_CLOSE,WM_CLOSE,PM_NOREMOVE ))
{
CleanExit(0);//让Main()循环处理终止的程序;
AfxMessageBox("exit!");
return 0;
}
Main(pv1);//循环捕包程序;
}
return 0;
}
void CWDlg::OnButton3()
{
// 终止线程;
PostThreadMessage(m_threadID,WM_CLOSE,0,0) ;
)
程序运行时,不能处理循环终止的那段代码,能否给一些修改的建议,还是这么做就不行呢?
在对话框里开一个线程,调用一个封装在静态库里面的函数,该函数可执行一个无限循环的程序(比如循环抓包)。现在能不能用终止线程的方式让该循环程序停下来?
编写的代码如下:
void CWDlg::OnButton1()
{
//开线程;
AfxBeginThread(threadFunc,this->GetSafeHwnd(),THREAD_PRIORITY_NORMAL); }
UINT threadFunc(LPVOID param)
{
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
g_dlg->m_threadID = GetCurrentThreadId();
if( PeekMessage( &msg,0,WM_CLOSE,WM_CLOSE,PM_NOREMOVE ))
{
CleanExit(0);//让Main()循环处理终止的程序;
AfxMessageBox("exit!");
return 0;
}
Main(pv1);//循环捕包程序;
}
return 0;
}
void CWDlg::OnButton3()
{
// 终止线程;
PostThreadMessage(m_threadID,WM_CLOSE,0,0) ;
)
程序运行时,不能处理循环终止的那段代码,能否给一些修改的建议,还是这么做就不行呢?
或者在循环中判断一个BOOL变量,如果为TRUE,则继续,否则停止循环。需要停止时把该变量设为FALSE。
初始化时将其赋为0
将循环改为
while(threadcontroller==0){
...
}很显然,在终止线程的函数里只要让threadcontroller为1,就行了
无限循环的程序(比如循环抓包)
在不停运行,所以应该为他添加一个运行状态的标志,如楼上所说
能够使他停止其实楼主的线程在该程序停止的时候就return了
while(nopause){....}结束线程之前 把nopause=false.