gpt4 book ai didi

c++ - 为什么从线程执行方法时使用 QMetaObject::invokeMethod

转载 作者:IT老高 更新时间:2023-10-28 23:03:37 63 4
gpt4 key购买 nike

我有以下代码:

class A : public QObject
{
Q_OBJECT
public:
A() : QObject()
{
moveToThread(&t);
t.start();
}
~A()
{
t.quit();
t.wait();
}

void doSomething()
{
QMetaObject::invokeMethod(this,"doSomethingSlot");
}
public slots:
void doSomethingSlot()
{
//do something
emit ready();
}
signals:
void ready();
private:
QThread t;
}

问题为什么从doSomething 必须通过QMetaObject::invokeMethod 调用。我知道有一些与连接类型有关的东西。 有人能解释一下幕后是什么吗?

最佳答案

由于你没有指定Qt::ConnectionType,该方法将被调用为Qt::AutoConnection,这意味着它将被同步调用(如一个正常的函数调用),如果对象的线程亲和性是当前线程,否则异步。 “异步”是指构造一个QEvent并推送到消息队列中,并在事件循环到达时处理。

如果接收对象可能在另一个线程中,则使用 QMetaObject::invokeMethod 的原因是尝试直接在另一个线程中的对象上调用插槽可能会导致损坏或更糟,如果它访问或修改非线程安全数据。

关于c++ - 为什么从线程执行方法时使用 QMetaObject::invokeMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13948337/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com