您的位置:逆风者 VC++ 正文
 添加时间:2008-03-21 原文发表:2008-03-21 人气:66 来源:vckbase.com

本文章共3407字,分3页,当前第1页,快速翻页:
 

作者:谭永光

下载源代码

  由于最近经常搞些跟线程有关的东西,感觉多线程确实麻烦,线程间要处理好同步与通讯,如果用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 - 下一页>>
相关文章

如何实现由列表控件控制的属性表
动态创建控件支持事件响应并可保存与读取
简单录、放音并保存为wav文件程序
I2C通信
文件过滤系统驱动开发Filemon学习笔记
DynamicLayout-VC 6.0对话框动态布局解决方
用命令模式实现对象存储——对象与关系数据
探讨性能测试中的计时问题
对OpenCV中的平面划分相关函数使用探索
让你的软件界面更漂亮(六)-- 仿QQ主界面之L
浅谈输入法编程
MFC 通用控件的初始化
基于GDI+的数字图像处理
运动搜索算法之钻石搜索(Ver1.0)
VC6下的GDI+双缓冲
使用SNMP编辑(添加/删除/修改)ARP表
VC6绘制3D饼状图
强制编译时约束
在C++中实现C#的delegate机制
一个工业控制管道流动控件的实现

相关评论


本文章所属分类:首页 VC++

  热门关键字: