编写了一个多线程调用的程序。大概描述如下:
在对话框里开一个线程,调用一个封装在静态库里面的函数,该函数可执行一个无限循环的程序(比如循环抓包)。现在能不能用终止线程的方式让该循环程序停下来?
编写的代码如下:
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) ;

    程序运行时,不能处理循环终止的那段代码,能否给一些修改的建议,还是这么做就不行呢?

解决方案 »

  1.   

    直接用TerminateThread不是可以终止线程吗?
    或者在循环中判断一个BOOL变量,如果为TRUE,则继续,否则停止循环。需要停止时把该变量设为FALSE。
      

  2.   

    main(pv1)不能循环调用,它本身也是个无限循环的函数。
      

  3.   

    在程序前加一个volatile int threadcontroller;
    初始化时将其赋为0
    将循环改为
    while(threadcontroller==0){
    ...
    }很显然,在终止线程的函数里只要让threadcontroller为1,就行了
      

  4.   

    在DOS下用CTR+C能够终止的循环函数,在WINDOWS下如何让它终止?
      

  5.   

    应该是楼主所谓的
    无限循环的程序(比如循环抓包)
    在不停运行,所以应该为他添加一个运行状态的标志,如楼上所说
    能够使他停止其实楼主的线程在该程序停止的时候就return了
      

  6.   

    AfxBeginThread返回的是一个CWinThread类,有一个成员 m_hThread就是了
      

  7.   

    始终循环那里这么写
    while(nopause){....}结束线程之前 把nopause=false.
      

  8.   

    your thread is work thread ,not UI thread ,so you can't post quit message to thread.you can use TerminateThread API,but it is not safe
      

  9.   

    而且结束进程应该是closehandle(m_thread); m_thread=NULL;