- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个包含两个线程的简单程序:
QApplication::exec
操作的主要 GUI 线程boost::asio::io_service
操作的 TCP 网络线程TCP 事件,例如连接或接收数据会导致 GUI 发生变化。大多数情况下,这些是 QLabel 上的 setText
和隐藏各种小部件。目前,我正在 TCP 客户端线程中执行这些操作,这似乎很不安全。
如何将事件正确发布到 Qt 主线程?我正在寻找 boost::asio::io_service::strand::post
的 Qt 变体,它将事件发布到 boost::asio::io_service
事件循环。
最佳答案
如果您的对象继承自 QObject,只需发出信号并将其连接(使用标志 Qt::QueuedConnection)到主线程中的插槽。信号和槽是线程安全的,应该优先使用。
如果它不是 QObject,那么您可以创建一个 lambda 函数(使用 GUI 代码)并使用单发 QTimer 将它排入主线程并在回调中执行它。这是我正在使用的代码:
#include <functional>
void dispatchToMainThread(std::function<void()> callback)
{
// any thread
QTimer* timer = new QTimer();
timer->moveToThread(qApp->thread());
timer->setSingleShot(true);
QObject::connect(timer, &QTimer::timeout, [=]()
{
// main thread
callback();
timer->deleteLater();
});
QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection, Q_ARG(int, 0));
}
...
// in a thread...
dispatchToMainThread( [&, pos, rot]{
setPos(pos);
setRotation(rot);
});
原始信用https://riptutorial.com/qt/example/21783/using-qtimer-to-run-code-on-main-thread
请小心,因为如果删除对象,您的应用可能会崩溃。两个选项是:
关于c++ - 如何在 Qt 主线程中正确执行 GUI 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34135624/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!