首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从非Qt线程调用qt插槽安全

从非Qt线程调用qt插槽安全
EN

Stack Overflow用户
提问于 2018-12-16 22:18:50
回答 1查看 590关注 0票数 3

我想调用一个MyWidget插槽

代码语言:javascript
复制
class MyWidget : public QWidget {
Q_OBJECT

public slots:
void onFooBar(const std::string&);/*std::string& could also be replaced
    by a QString for easier meta system handling*/
};

但是因为在我使用boost::asio的情况下,对于线程,我不想用Qt做任何事情,所以我想从一个不同于主线程的线程调用这个插槽,但是是一个我不能控制的随机线程。(当然,在我允许运行boost::asio的线程中)

我该怎么做呢?QCoreApplication::postEvent似乎是一个不错的选择,但文档并没有指出如何创建必要的QEvent的好方法。带有Qt::QueuedConnectionQMetaObject::invokeMethod看起来也不错,但文档中没有说明是线程安全的。

那么,如何安全地从非qt托管线程中调用qt 呢?

(尽管Boost asio with Qt的标题表明这可能是重复的,但对我来说,这个问题似乎完全不同,这个问题不一定与boost::asio有关)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-17 04:55:38

事实证明,带有Qt::QueuedConnectionQMetaObject::invokeMethod实际上在其实现中使用了QCoreApplication::postEvent (感谢@peppe!)。但是,保证它是线程安全的,当

与由Qt管理的接收方的Qt::QueuedConnection

  • Lifetime一起使用(或至少在完成调用之前)

  • 从qt管理的参数的非主要Qt thread

  • Lifetime对接收方没有其他操作(在使用Q_ARS或call by value时应该没问题)

还没有被记录下来。但我已经创建了一个bug reportqt forum讨论,似乎是有意如此,并且已经创建了一个documentation change ticket

我在最后使用的是通用模式

代码语言:javascript
复制
class MyWidget : public QWidget {
Q_OBJECT

public slots:
void onFooBar(QString);
};

void asio_handler(const std::string& string, MyWidget* my_widget) {
QMetaObject::invokeMethod(
                        my_widget, "onFooBar", Qt::QueuedConnection,
                        Q_ARG(QString, QString::fromStdString(string))
                        );
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53803018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档