类中包括一个线程函数
需要在类中有两个函数,
一个公有函数Run,负责启动线程;
一个保护函数StartTrace,负责在线程中工作。(属性为保护,是为了不让用户调用)
问题:
如果ThreadTest中直接写,那么无法调用保护的函数StartTrace。
直接用static声明,那样就没办法访问类内部的成员。
用friend声明,那样就无法进行继承派生。
-
如果上面的可以实现,那是我浅薄了,还请具体说一下实现的方法。
还请各位指点一二。
这段是用友元实现的代码。
- C/C++ code
// CThreadTrace.h#pragma onceclass CThreadTrace{public: CThreadTrace(void); ~CThreadTrace(void);public: void Run();protected: friend void TraceMsg(CThreadTrace &cls); void StartTrace();private: void OutMsg(int &nCount);};
- C/C++ code
// CThreadTrace.cpp#include "StdAfx.h"#include "ThreadTrace.h"CThreadTrace::CThreadTrace(void){}CThreadTrace::~CThreadTrace(void){}void TraceMsg(CThreadTrace &cls){ cls.StartTrace();}static UINT ThreadTest(LPVOID lp){ CThreadTrace *pCls = (CThreadTrace *)lp; TraceMsg(*pCls); return 0;}void CThreadTrace::StartTrace(){ int nCount = 0; while (1) { OutMsg(nCount); Sleep(700); }}void CThreadTrace::Run(){ AfxBeginThread(ThreadTest ,this);}void CThreadTrace::OutMsg(int &nCount){ printf("%u -> trace %d\n" ,this ,++nCount);}
[解决办法]
考虑将线程类设实现为一个基类
具体的线程routine实现为一个virtual函数
派生类只要重写该virtual就可以具有不同行为(protected 访问权限)
- C/C++ code
class iamthread{public:int createThread(){ //WINAPI CreateThread return CreateThread(threadRoutine,this); }private:static int threadRoutine(LPVOID){ iamthread *pt = (iamthread *)LPVOID if(pt) return pt->privateRoutine(); return -1;}protected:vitrual int privateRoutine(){ while(1) { //do anything you want here. } return 0;}private:HANDLE m_hThreadHandle; }
[解决办法]
代码省略很多 不能直接用的啊
不过大体是这样
这段代码是从Directshow 里学来的
[解决办法]
考虑下启动的线程是挂起的线程,
StartTrace将挂起的线程启动。
[解决办法]
直接用static声明,那样就没办法访问类内部的成员。
参数传对象的指针就行了
void A::threadfun(void* in_handle)
{
A* node = (A*)in_handle;
node->
}