在继承的类中启动线程

Starting threads in inherited classes

本文关键字:启动 线程 继承      更新时间:2023-10-16

我希望在一个项目的类内运行线程。也就是说,当我创建一个对象,然后调用成员函数"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);
};

你正在为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()来等待线程完成它的工作。另一种选择是分离线程…谷歌一下,因此,您可以更好地理解可接合线程之间的区别
  • 虚拟析构函数99%是一个好主意!让他们。它们对于根据类层次结构正确清理实例非常有用。
  • 注意MainThreadFunction定义中的= 0。它是可选的,但我认为它适合你。一旦必须扩展ThreadClass,基本上不需要实现不做任何事情的方法。你把你的ThreadClass在一个抽象类。