作者:谭永光
下载源代码
由于最近经常搞些跟线程有关的东西,感觉多线程确实麻烦,线程间要处理好同步与通讯,如果用CWinThread好一点,直接是一个线程对象,如果用AfxBeginThread,那必须定个全局函数,或者写个静态函数,一般是传个this指针进去,然后再用这个指针调用本类函数的成员函数,用起来比较麻烦,现在问题是能不能不用全局或者静态函数来实现呢,于是我实现了这个类,来所简化多线程的创建和关闭的操作。 逆风编程精品
现在简要看一下类的数据和成员函数
template<class T>
class CYGMulThread
{
protected:
typedef void (T::* _pThreadFunc)(void );
static _pThreadFunc ThreadFunc;
static BOOL s_IsBreaking; //用以判断线程是否要中断
static CWaitDlg s_Waitdlg;//等待对话框
//内部线程
static UINT ThreadProc(LPVOID lpParam);
public:
//在线程内部使用,用以判断有没有要结束的信号
static BOOL IsBreakThread() ;
//----------------------------非静态
protected:
CYGMulThread();
virtual ~CYGMulThread();
CWinThread **m_pThread;//线程数组指针
int m_nThreadCount;
//处理windows的消息
void PeekMessageLoop();
public:
int GetThreadCount() const ;
//pFunc=输入一个void f(void)的成员函数,nThreadCount=线程数目
void YGBeginFuncThread(_pThreadFunc pFunc,int nThreadCount);
//结束线程时调用
bool EndAllThread(const char *szMsg);
};
一、这里先说一下这个类的使用方法
class CMulThreadDlg : public CDialog,private CYGMulThread
{
// Construction
public:
CMulThreadDlg(CWnd* pParent = NULL); // standard constructor
void ReleaseShow2();
void ReleaseShow();
void ThreadFunc();
// Dialog Data
//{{AFX_DATA(CMulThreadDlg)
enum { IDD = IDD_MULTHREAD_DIALOG };
CYGEdit m_edShow;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMulThreadDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMulThreadDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnBtnDebug();
afx_msg void OnBtnStop();
afx_msg void OnBtnTest1();
afx_msg void OnBtnTest2();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
这里要注意两个地方:
1.CYGMulThread的模板是用被派生出来的类,这里的好处,就是可以使CYGMulThread可以使用被派生出来的东西,至于还有什么好处,有兴趣的朋友可以看一下ATL和WTL里的代码,里面大量使用这种结构。
2.这里用的私有继承,当然也可以用公用继承:),个人觉得这样私有继承,数据封装性好一点。
CMulThreadDlg有了这样的头定义后,就可以使用下面的行为了
void CMulThreadDlg::ThreadFunc()
{
DWORD dwID=GetCurrentThreadId();
while (1)
{
// g_cs1.Lock();
TRACE("线程:%x\t路过\n",dwID);
// g_cs1.Unlock();
Sleep(200);
if (IsBreakThread())
{
// g_cs1.Lock();
TRACE("线程:%x要结束了!\n",dwID);
// g_cs1.Unlock();
return ;
}
Sleep(10000);
}
}
//创建线程
void CMulThreadDlg::OnBtnDebug()
{
YGBeginFuncThread(ThreadFunc,10);//创建10个线程,其函数为ThreadFunc,这里ThreadFunc是CMulThreadDlg的成员函数
}
//结束线程
void CMulThreadDlg::OnBtnStop()
{
EndAllThread("正要结束线程....");
}
本文章更多内容:1 - 2 - 3 - 下一页>> |