访问QT小部件线程安全
Accessing Qt widget thread safe
我使用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>
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区