2016-03-01 42 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