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
那么我认为这将是更简单的方法。不会使用mutex
。 TestClass::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 中的同步的主要内容,如果未能解决你的问题,请参考以下文章
重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)