Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMetaObject::invokeMethod返回true,但从未调用该方法_C++_User Interface_Qt_Multithreading - Fatal编程技术网

C++ QMetaObject::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在GUI线程上运行一个方法,该方法返回true。但是,如果我使用Qt::QueuedConnection,我的方法永远不会被调用(即使invokeMethod返回true)

这就是我正在使用的:

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()
是类的公共插槽。插槽永远不会被调用。