Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ Qt:调用QEventLoop::exec后出现死锁_C++_Multithreading_Qt_Deadlock_Qeventloop - Fatal编程技术网

C++ Qt:调用QEventLoop::exec后出现死锁

C++ Qt:调用QEventLoop::exec后出现死锁,c++,multithreading,qt,deadlock,qeventloop,C++,Multithreading,Qt,Deadlock,Qeventloop,我有一个相当简单的应用程序,当我调用QEventLoop::exec时,它在某些情况下似乎会死锁。应用程序在两种情况下调用此函数: 当某些数据到达套接字时 在计时器事件发生时 在这两种情况下,它都在以下上下文中使用(只是一个http查询,没有什么特别之处): 下面是当它试图调用它时发生的情况: ... #56 0x0000003404b57cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/l

我有一个相当简单的应用程序,当我调用QEventLoop::exec时,它在某些情况下似乎会死锁。应用程序在两种情况下调用此函数:

  • 当某些数据到达套接字时
  • 在计时器事件发生时
在这两种情况下,它都在以下上下文中使用(只是一个http查询,没有什么特别之处):

下面是当它试图调用它时发生的情况:

...    
#56 0x0000003404b57cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
#57 0x0000003404b804a2 in ?? () from /usr/lib64/libQtCore.so.4
#58 0x0000003404b7d928 in ?? () from /usr/lib64/libQtCore.so.4
#59 0x00000033fba38f0e in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#60 0x00000033fba3c938 in ?? () from /lib64/libglib-2.0.so.0
#61 0x00000033fba3ca3a in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#62 0x0000003404b7d5f3 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#63 0x0000003404b56722 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#64 0x0000003404b569ec in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#65 0x00007f41c1b4eec7 in HttpGetMessagesStrategy::syncHttp (this=<value optimized out>, url=<value optimized out>, dst=...) at HttpGetMessagesStrategy.cpp:49
#70 0x000000000040e57c in DevicePlugin::timerEvent (this=0x1267390, event=0x7fff902bb5f0) at DevicePlugin.cpp:250
#71 0x0000003404b6698e in QObject::event(QEvent*) () from /usr/lib64/libQtCore.so.4
#72 0x0000003404b57cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
...
谁能解释一下我做错了什么吗?

int QEventLoop::exec(ProcessEventsFlags flags=AllEvents)进入 主事件循环并等待,直到调用exit()。返回 传递给exit()的值

exec()是QT事件处理的表示形式,在当前线程返回exit()之前,它始终是一个阻塞调用。这允许主循环exec()之外的线程使用QT信号和插槽,而不会产生冲突

您应该将finished()调用和头文件中定义的自己的处理槽连接起来


如果您想使用信号和插槽并使用QObject Makro,请不要忘记从QObject(或任何其他QT对象)继承每个类。

您有两个事件循环正在运行。第二个事件循环并不阻塞第一个事件循环,它只是阻塞当前方法,因此处理不能返回到第一个事件循环。但是,当数据到达套接字时,会触发事件并再次运行方法。在我看来,唯一的解决方案是将设计更改为在
syncHttp
方法中不阻塞,并使用信号和插槽重新连接此方法的整个交互

至于
exec
惯用语,来自:

警告:对于测试用例,这种方法很有效。对于实际应用程序,请避免使用它。最好将要等待的函数分成两部分,并在单独的插槽中处理信号


如果您有一个事件驱动的应用程序(如果您正在使用Qt,通常是这样),并且突然需要这样阻止—这意味着存在一个设计问题。

您试图以阻止方式使用
QNetworkManager
QNetworkReply
,而不是设计为这样做的


考虑改用或重新设计程序以使用异步机制。

这些只是一些与问题无关的随机Qt事实吗?谢谢您的回答。我要试一试。虽然我几乎可以肯定,这是执行同步http请求的一种标准方式:@ArtemPervin是的,这是一种已知且经常使用的习惯用法。然而,在这些情况下,IIRC不会这样做。
...    
#56 0x0000003404b57cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
#57 0x0000003404b804a2 in ?? () from /usr/lib64/libQtCore.so.4
#58 0x0000003404b7d928 in ?? () from /usr/lib64/libQtCore.so.4
#59 0x00000033fba38f0e in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#60 0x00000033fba3c938 in ?? () from /lib64/libglib-2.0.so.0
#61 0x00000033fba3ca3a in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#62 0x0000003404b7d5f3 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#63 0x0000003404b56722 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#64 0x0000003404b569ec in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#65 0x00007f41c1b4eec7 in HttpGetMessagesStrategy::syncHttp (this=<value optimized out>, url=<value optimized out>, dst=...) at HttpGetMessagesStrategy.cpp:49
#70 0x000000000040e57c in DevicePlugin::timerEvent (this=0x1267390, event=0x7fff902bb5f0) at DevicePlugin.cpp:250
#71 0x0000003404b6698e in QObject::event(QEvent*) () from /usr/lib64/libQtCore.so.4
#72 0x0000003404b57cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
...
#0  0x00000033faa0efe0 in __pause_nocancel () from /lib64/libpthread.so.0
#1  0x00000033faa0917b in __pthread_mutex_lock_full () from /lib64/libpthread.so.0
#2  0x0000003404a702a3 in ?? () from /usr/lib64/libQtCore.so.4
#3  0x0000003404a6cd95 in QMutex::lock() () from /usr/lib64/libQtCore.so.4
#4  0x0000003404b57952 in QCoreApplication::postEvent(QObject*, QEvent*, int) () from /usr/lib64/libQtCore.so.4
#5  0x000000000040e293 in DevicePlugin::destroyConnection (this=0x1267390, c=0x1a85fb0) at DevicePlugin.cpp:194
#6  0x000000000040e5b6 in DevicePlugin::timerEvent (this=0x1267390, event=0x7fff902b9230) at DevicePlugin.cpp:254
#7  0x0000003404b6698e in QObject::event(QEvent*) () from /usr/lib64/libQtCore.so.4
#8  0x0000003404b57cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
...