class IThreadFun
{
public:
 virtual void OnDo()=0;
};

//每200毫秒调用一次IThreadFun的OnDo
class CThreadHlp
{
public:
 static void StartThread(IThreadFun* pFun)
 {
  if( NULL != s_pThread )
   return ;
  s_pFun = pFun ;
  s_bDo = true;
  s_pThread = AfxBeginThread(SysThreadFun,NULL);
 }
 static void EndThread()
 {
  if( NULL == s_pThread )
   return ;
  s_bDo = false;
  WaitForSingleObject(s_pThread->m_hThread, INFINITE);//
  s_pThread = NULL;
 }
protected:
 static IThreadFun* s_pFun;
 static bool s_bDo  ;
 static CWinThread* s_pThread;
 static UINT SysThreadFun(LPVOID p)
 {
  while(s_bDo )
  {
   Sleep(200);//可优化
   if( NULL != s_pFun )
   {
    s_pFun->OnDo();
   }
  }
  return 0;
 }
};

//
IThreadFun* CThreadHlp::s_pFun = NULL ;
bool CThreadHlp::s_bDo = false ;
CWinThread* CThreadHlp::s_pThread = NULL;

class CTestThreadFun : public IThreadFun
{
public:
 virtual void OnDo()
 {
  for( int i = 0 ; i < 10 ; i++ )
  {
   CString str;
   str.Format("%d ",i);
   TRACE(str);
   Sleep(100);
  }
  TRACE("\r\n");
 }
};

 

测试环境:Win7+VS2005

 

CTestThreadFun fun;
CThreadHlp hlp ;
void CtestexeDlg::OnBnClickedButton2()

 hlp.StartThread(&fun);
}

void CtestexeDlg::OnBnClickedButton3()
{
 hlp.EndThread();
}

 

无论如何点击 Btn2和Btn3,输出都是完整的(1到10都有)

单击Btn2后直接关闭,输出可能不完整。

posted on 2020-10-15 17:23  闻缺陷则喜何志丹  阅读(3)  评论(0编辑  收藏  举报  来源