簡體   English   中英

在繼承的類中啟動線程

[英]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為此,您可以更好地理解可連接線程和分離線程之間的區別。
  • virtul破壞者是99%的好主意! 留着它們。 它們對於根據類層次結構正確關閉實例很有用。
  • 注意MainThreadFunction的定義中的= 0 它是可選的 ,但我認為它很適合您。 一旦必須擴展ThreadClass ,您基本上不需要實現不執行任何操作的方法。 您將ThreadClass為抽象類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM