2016-03-01 89 views
0

我想寫一些必須在自己的線程工作的類。 我讀過這篇文章:http://wiki.qt.io/Threads_Events_QObjects。它建議移動對象,在自己的線程工作,如:QThread moveToThread。在QThread同步

TestClass tst; 
QThread *thread = new QThread(); 
tst.moveToThread(thread); 
thread->start(); 
QObject::connect(thread, SIGNAL(started()), &tst, SLOT(start())); 

而且在識別TestClass的slot我把所有的初始化程序。 1.我可以在TestClass的構造函數中移動到線程嗎?像:

TestClass::TestClass() { 
    QThread *thread = new QThread(); 
    this->moveToThread(thread); 
    thread->start(); 
    QObject::connect(thread, SIGNAL(started()), this, SLOT(start())); 
} 

之後,此類的所有對象將在自己的線程中工作。

  1. TestClass我有私人struct它可以在兩個線程中進行更改。 我應該使用mutex爲或使用信號/時隙:

    void TestClass::changeStruct(int newValue) { 
        // invoked in main thread 
    
        emit this->changeValue(newValue); 
    
    } 
    
    // slot 
    void TestClass::changeStructSlot(int newValue) { 
        // this slot will be invoked in the second thread 
        this._struct.val = newValue; 
    } 
    
+0

爲什麼,僅僅發出信號的功能,爲什麼不把信號連接到'的TestClass :: changeStructSlot'併發出在那裏你調用'的TestClass :: changeStruct'該信號,或致電['QMetaMethod ::調用'](http://doc.qt.io/qt-5/qmetamethod.html#invoke)/ ['QMetaObject :: invokeMethod'](http://doc.qt.io/qt-5/qmetaobject.html #invokeMethod)。 – thuga

+0

在啓動線程之前更好地連接'SIGNAL(start())',否則可能會由於競態條件而丟失信號。 –

回答

1
  1. 我不會從設計上看至少做到這一點。在TestClass應該做什麼的基礎上,嘗試添加內部線程管理。另外TestClass析構函數會因爲線程管理而變得有點複雜。

  2. 每個TestClass對象都有自己的struct。如果來自主線程的調用是更改val的唯一方法,則不需要做任何事情。如果val可以從多於1個的線程(包括它自己的線程)更改,則使用QMutex

+0

2.所以,如果我將使用插槽/信號我如何寫上面這意味着該方法可以在任何線程中調用,但'slot'('changeStructSlot')總是將在TestClass的線程中執行,是不是? – Mike

+0

正確。除非您決定不使用默認連接類型,否則它應該沒有併發性。這個頁面解釋了詳細信息:[線程間的信號和插槽](http://doc.qt.io/qt-4.8/threads-qobject.html#signals-and-slots-across-threads) – StahlRat

+0

然後我認爲它會更簡單的方法。不會使用'mutex'。 'TestClass :: TestClass() /*默認類型連接 - 自動連接。 */ connect(this,SIGNAL(changeValue(int)),this,SLOT(changeStructSlot(int))); /*其他的東西*/ } 空隙的TestClass :: changeStruct(INT newValue)以{ /*此方法可在任何線程中調用*/ EMIT這 - > changeValue(NEWVALUE); }'對嗎? – Mike