[英]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()
以便等待線程完成其工作。 另一種選擇是分離線程... Google為此,您可以更好地理解可連接線程和分離線程之間的區別。 MainThreadFunction
的定義中的= 0
。 它是可選的 ,但我認為它很適合您。 一旦必須擴展ThreadClass
,您基本上不需要實現不執行任何操作的方法。 您將ThreadClass
為抽象類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.