在继承的类中启动线程
Starting threads in inherited classes
我希望在一个项目的类内运行线程。也就是说,当我创建一个对象,然后调用成员函数"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
在一个抽象类。
相关文章:
- 使用 std::string () const 函数启动线程或未来
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 使用 std::thread & std::bind 在成员函数中启动线程
- GDB 输出启动线程,但给出输出
- 尝试在我的基类中启动线程时,Visual Studio 由于调试错误而中止我的程序
- 启动线程会导致指针初始化时出现分段错误
- OMP 不启动线程
- 在关闭时升级登录中的启动线程访问违规
- 如何在dllmain中启动线程
- 如何使用媒体基础在给定时间运行/启动线程
- 如何在另一个核心上启动线程而不将处理器亲和力设置为特定核心
- Qt多线程启动线程错误
- 在构造函数中使用"this"启动线程是安全的?
- 停止,然后启动线程
- C++/Win32 我在 Windows 2000+ 上启动线程的最佳方式
- 如何在事件发生时启动线程并严格关闭其句柄
- 从 Poco::HTTPServer 启动线程
- 在成员函数上启动线程时不需要的析构函数调用
- C++线程库,在完成前两个线程后启动线程
- 使用父窗口在对象中启动线程