首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

种中包括一个线程函数

2012-09-14 
类中包括一个线程函数需要在类中有两个函数,一个公有函数Run,负责启动线程;一个保护函数StartTrace,负责在

类中包括一个线程函数
需要在类中有两个函数,
一个公有函数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->
}

热点排行