在继承的类中启动线程

时间:2015-10-16 14:55:50

标签: c++ multithreading class inheritance

我希望在项目的类中运行线程。也就是说,当我创建一个对象,然后调用一个成员函数“StartThread”时,它将开始在对象中执行我的MainThreadFunction。我可以在所有不同的类中重写关于如何启动线程的类似代码,但是使用继承更有意义,并且有一个名为ThreadClass的基类,其他类可以从中继承。

MainThreadFunction当然是虚拟的,并且根据继承它的类的类型实现不同。问题是,我不确定我是否正确的方式。当我在不同的类中实现这个虚函数并调用继承的函数StartThread时,它应该使用这种方法执行正确的MainThreadFunction吗?创建GaugeController的对象,我不确定是否应该用基础构造函数初始化。

我对线程和继承非常陌生,任何想法或帮助将不胜感激。感谢。

我的主要问题是,如果这是一个很好的设计,让类继承自我的ThreadClass以具有线程特征。

//In ThreadClass.h
class ThreadClass
{
    public:
        ThreadClass();
        //virtual ~ThreadClass();
        void StartThread();
        virtual void MainThreadFunction();  
    protected:
        std::thread t;
        bool threadStop = false;

};
////////////////////////////////////////////////////////////////////////////
// In ThreadClass.cpp
ThreadClass::ThreadClass() : t()
{

}

void ThreadClass::StartThread()
{
    t = std::thread(&ThreadClass::MainThreadFunction, this);

}

void ThreadClass::MainThreadFunction()
{
  // The implementation will be different for each child class

}

/////////////////////////////////////////////////////////////////////////
// In GaugeController.h
class GaugeController : public ThreadClass
{
    public:
        GaugeController(DataChannel& dc);
        ~GaugeController();
        void StartThread();
        virtual void MainThreadFunction();
        void WriteData(float data);

};

1 个答案:

答案 0 :(得分:-1)

你是“有点”为std::thread制作包装,这就是你想要使用的东西。所以你可能正在寻找这样的东西:

//In ThreadClass.h
class ThreadClass
{
    public:
        ThreadClass();
        virtual ~ThreadClass() {}
        void StartThread();
        virtual void MainThreadFunction() = 0; // this good for you
    protected:
        std::thread t;
        bool threadStop = false;

};
////////////////////////////////////////////////////////////////////////////
// In ThreadClass.cpp
ThreadClass::ThreadClass() : t()
{
}

void ThreadClass::StartThread()
{
    t = std::thread(&ThreadClass::MainThreadFunction, this);
}

// you must join your thread!
void ThreadClass::join()
{
    t.join();
}


/////////////////////////////////////////////////////////////////////////
// In GaugeController.h
class GaugeController : public ThreadClass
{
    public:
        GaugeController(DataChannel& dc);
        virtual ~GaugeController() {}
        void StartThread();
        virtual void MainThreadFunction();
        void WriteData(float data);

};
  • 使用join()!默认情况下,来自std::thread的线程是可连接的, 所以你需要调用join()才能等待线程完成 它的工作。其他选择是分离你的线程...谷歌为它, 这样你就可以更好地理解可连接线程之间的区别 和分离的线程。
  • virtul destructors 99%的好主意!保留它们。它们对于根据类层次结构正确清理实例非常有用。
  • 注意= 0定义中的MainThreadFunction。这是可选,但我认为它适合您。一旦ThreadClass必须扩展,您基本上不需要实现不执行任何操作的方法。您将ThreadClass转换为抽象类。