内容摘要:如果用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 作者:谭永光 责编:豆豆技术应用