访问QT小部件线程安全



我使用qplaintExtedIt显示一些文本。该文本将在另一个线程中修改(附加),而不是UI(主)线程,并将信号发送到Widget

connect(this, SIGNAL(addText(QString)), mUi->plainTextEditLog, SLOT(appendPlainText(QString)));
...
emit addText(QString::fromStdString(someString));
...

另一个线程是读取此明文的文本,并将其写入文件

QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
    return;
}
file.write(mUi->plainTextEditLog->toPlainText().toUtf8());
file.close();

据我所知,QT小部件不是安全的。我考虑了一个互惠plo锁定写作信号的静音,但这实际上不会锁定它,因为它只是异步发送信号。

我之所以使用信号的原因是,在这种情况下,可以从多个线程调用写作方法,而mutex则无济于事,但信号确实非常完美。

第二个想法是将文本也存储在我的班级中,并用相互排除锁定字符串。但是我不确定这是否非常有效,因为不仅有必须修改的明文版,而且还具有字符串为副本。

本质上,只要您使用自动或排队连接(请参阅qobject :: connect)从属于另一个线程的对象连接信号时(请参见qobject :: movetothRead)到一个小部件(必须属于主GUI线程),然后发射信号将是异步的"火与忘记"呼叫。您也可以通过指定它是一个阻止排队连接来使呼叫同步,但是除非您真的需要它,否则我不建议它。

QT中的螺纹模型需要一点时间来缠绕您的头,但是您会成长为简单信号和插槽中提供的多线程代码提供的插槽,并且不再需要使用Mutexes来保护他们的数据。<<<<<<。/p>

最新更新