多线程管理类

豆豆网   技术应用频道   2008年01月14日  【字号: 收藏本文

内容摘要:如果用AfxBeginThread,那必须定个全局函数,或者写个静态函数,一般是传个this指针进去,然后再用这个指针调用本类函数的成员函数,用起来比较麻烦,现在问题是能不能不用全局或者静态函数来实现呢,于是我实现了这个类,来所简化多线程的创建和关闭的操作。

  CMulThreadDlg有了这样的头定义后,就可以使用下面的行为了

void CMulThreadDlg::ThreadFunc()
{
  DWORD dwID=GetCurrentThreadId();
  while (1)
  {
//    g_cs1.Lock();
    TRACE("线程:%x  路过
",dwID);
//    g_cs1.Unlock();
    Sleep(200);
    if (IsBreakThread())
    {  
//      g_cs1.Lock();
      TRACE("线程:%x要结束了!
",dwID);
//      g_cs1.Unlock();
      return ;
    }
    Sleep(10000);  
  }
}
//创建线程
void CMulThreadDlg::OnBtnDebug()
{
  YGBeginFuncThread(ThreadFunc,10);//创建10个线程,其函数为ThreadFunc,这里ThreadFunc是CMulThreadDlg的成员函数
}
//结束线程
void CMulThreadDlg::OnBtnStop()
{
  EndAllThread("正要结束线程....");
}
二、下面说明一下代码的内容

  其实创建线程的操作很简单,最令人烦不胜烦的地方是结束线程的代码。

  一般其流程是:

  1.通知所以线程要结束

  2.等待所以线程结束

  通知其实倒挺好通知,问题是等待!

  第一个问题,主线程界面,考虑的第一个函数是WaitForMultipleObjects,问题是主线用这个函数等待子线程结束时,令主线程会处于休眠状态,如果等待时间长的话,程序就会像死了似的。于是把函数换为MsgWaitForMultipleObjects,令其每次只等待一个线程,而且将其参数bWaitAll设为FALSE,并在调用这个函数前,用PeekMessageLoop处理完Windows留下的消息,这样主界面看起来就不会出问题 。

来源:vckbase    作者:谭永光    责编:豆豆技术应用

正在加载评论...