我希望在项目的类中运行线程。也就是说,当我创建一个对象,然后调用一个成员函数“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);
};
答案 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()
才能等待线程完成
它的工作。其他选择是分离你的线程...谷歌为它,
这样你就可以更好地理解可连接线程之间的区别
和分离的线程。= 0
定义中的MainThreadFunction
。这是可选,但我认为它适合您。一旦ThreadClass
必须扩展,您基本上不需要实现不执行任何操作的方法。您将ThreadClass
转换为抽象类。