QThread 移动到线程。 QThread 中的同步

Posted

技术标签:

【中文标题】QThread 移动到线程。 QThread 中的同步【英文标题】:QThread moveToThread. Synchronization in QThread 【发布时间】:2016-03-01 16:26:41 【问题描述】:

我想编写一些必须在自己的线程中工作的类。 我读过这篇文章:http://wiki.qt.io/Threads_Events_QObjects。它建议移动必须在自己的线程中工作的对象,例如:

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

slot 的 TestClass 中,我放置了所有初始化程序。 1. TestClass的构造函数中可以moveToThread吗?喜欢:

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

之后这个类的所有对象都将在自己的线程中工作。

    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;
    
    

【问题讨论】:

为什么要有一个只发出信号的函数,为什么不将信号连接到TestClass::changeStructSlot 并在调用TestClass::changeStruct 或调用QMetaMethod::invoke / QMetaObject::invokeMethod 的地方发出该信号。跨度> 最好在启动线程之前连接SIGNAL(start()),否则您可能会因竞争条件而丢失信号。 【参考方案1】:

    至少从设计的角度来看,我不会这样做。除了TestClass 应该做的事情之外,您还尝试添加内部线程管理。由于线程管理,TestClass 析构函数也会有点复杂。

    每个TestClass 对象都有自己的struct。如果来自主线程的调用是更改val 的唯一方法,则无需执行任何操作。如果val 可以从多个线程(包括它自己的线程)更改,则使用QMutex

【讨论】:

2.因此,如果我将使用我在上面编写的插槽/信号,这意味着可以在任何线程中调用该方法,但 slot (changeStructSlot) 总是会在 TestClass 的线程中执行,不是吗? 正确。除非您决定不使用默认连接类型,否则它不应该是并发的。本页说明详情:Signals and Slots Across Threads 那么我认为这将是更简单的方法。不会使用mutexTestClass::TestClass() /* default type connection - Auto Connection. */ connect(this, SIGNAL(changeValue(int)), this, SLOT(changeStructSlot(int))); /* other stuff */ void TestClass::changeStruct(int newValue) /* this method can be invoked in an any thread */ emit this->changeValue(newValue); 对吗? 是的,这个或直接调用 emit TestClassObject->changeValue(newValue); 应该可以工作,并且由于自动连接而无需互斥锁。

以上是关于QThread 移动到线程。 QThread 中的同步的主要内容,如果未能解决你的问题,请参考以下文章

Qt on Python 中的 QThread

重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)

如何处理 QThread 上的事件?

Qt - QThread(翻译帮助文档)

QThread moveToThread 不起作用

QThread - 如何停止工人?