C++ QMetaObject::invokeMethod返回true,但从未调用该方法
我正在尝试使用QMetaObject::invokeMethod在GUI线程上运行一个方法,该方法返回true。但是,如果我使用Qt::QueuedConnection,我的方法永远不会被调用(即使invokeMethod返回true) 这就是我正在使用的:C++ QMetaObject::invokeMethod返回true,但从未调用该方法,c++,user-interface,qt,multithreading,C++,User Interface,Qt,Multithreading,我正在尝试使用QMetaObject::invokeMethod在GUI线程上运行一个方法,该方法返回true。但是,如果我使用Qt::QueuedConnection,我的方法永远不会被调用(即使invokeMethod返回true) 这就是我正在使用的: QMetaObject::invokeMethod(this, "draw_widgets", Qt::QueuedConnection) 我没有收到任何错误消息或任何东西。。。 如果我使用Qt::AutoConnection或Qt::D
QMetaObject::invokeMethod(this, "draw_widgets", Qt::QueuedConnection)
我没有收到任何错误消息或任何东西。。。
如果我使用Qt::AutoConnection或Qt::DirectConnection,则会调用该方法,当然是从同一个线程调用。不是从GUI线程,这是我需要的
draw_widgets是void draw_widgets()类型的公共插槽
我的类继承QObject并使用Q_OBJECT宏
如果您能在这方面提供帮助,或者如何检查为什么不调用该方法,我将不胜感激
谢谢。正确消息告诉您消息已成功排队。这并不意味着排队的消息曾经被处理过
假设您的程序有10个线程(Thread1-Thread10)。您可以对来自Thread7的消息进行排队。它将排队到哪个线程?什么时候处理这个队列上的项目
答案是,每个QObject
都有一个被调用的线程,这就是运行排队插槽的线程。默认关联是创建对象的线程(但可以使用更改)
如果要将某些内容排队到GUI线程,则由this
指针指定的对象应具有GUI线程的关联性。您可以使用该方法检查这一点
但在任何情况下,无论您排队等待哪个线程。。。你必须有某种消息泵在该线程上运行。例如,看看。如果您的线程与GUI关联,那么可能已经是这样了,因为您正在运行应用程序的exec
(作为旁注,直接调用
QMetaObject::invokeMethod
通常是不必要的。您可以创建一个信号并将其绑定到插槽,然后发出该信号来代替调用。)非常感谢您的回答。我不知道线程关联。将对象的关联性更改为GUI线程解决了问题。@HostileFork Antiminate sidenote,如果插槽太多,它将被创建为与插槽相同的信号,因此在这种情况下,使用QMetaObject::invokeMethod(这是“插槽1…n”,Qt::QueuedConnection)
@HostileFork Antiminate sidenote continue,invokeMethod
调用应该在插槽内部条件检查if(QThread::currentThread()!=thread())
中执行。通过这种方式,客户端可以直接调用slots。我有一个类似的情况:我有一个从QObject继承的类,它使用Q\u OBJECT
。此类的实例是在主循环中创建的。然后,在主循环中执行同一类的方法时,我调用QMetaObject::invokeMethod(这是“hideListsSlot”,Qt::QueuedConnection)
,其中void hideListsSlot()
是类的公共插槽。插槽永远不会被调用。