【问题标题】:QEventLoop has already called exec() even with exit() beforeQEventLoop 已经调用了 exec() 即使之前使用了 exit()
【发布时间】:2015-09-28 16:54:39
【问题描述】:

我有一个通过 myfuntion 点击​​连接的按钮,见下文。

我正在使用 QEventLoop,因为我正在等待一个事件,它将调用 _myEventLoop.exit(0);

当我连续两次单击按钮而不等待事件发生时,我收到错误消息:

QEventLoop::exec: instance 0x22f47378 has already called exec()

我在调用 exec() 之前调用了 exit(1),但似乎这个 exit 立即返回,然后函数通过 exec(),因为它仍在运行 return 1,myfunction 返回并且只有第一个exec() 返回 1。

在继续之前,我如何确定之前对 exec() 的调用已经返回?

void myfuntion()
{
    _myEventLoop.exit(1);
    if(_myEventLoop.exec() == 0)
    {
        // DoSomething
    }
}

【问题讨论】:

  • 这里的目标到底是什么?我不明白一遍又一遍地重新启动本地事件循环有什么意义。
  • 我的目标是在某个事件之前阻止该函数的用户。如果该函数被其他人调用以释放第一个用户并阻止最后一个调用者。根据我对 eventLoop 工作原理的理解,我不能,我完全改变了概念。
  • @Giacogiac 你能详细说明你的方法吗?
  • @RDP 我没能阻止执行。所以我使用回调。我想写:void MyClass::onClick() { if(_myEventManager->pick()) // blocking { // DoSomething } } 我在做什么:void MyClass::onClick() { _myEventManager->cancelPick(); // calls previous callback with success == false _myEventManager->requestPick(this, &MyClass::onPick); } void MyClass::onPick(bool success) { if(success) { // DoSomething } }

标签: c++ qt qt5.5 qeventloop


【解决方案1】:

您可以致电QEventLoop::processEvents 处理任何未决事件。
你的代码会是这样的:

void myfuntion()
{
    _myEventLoop.exit(1);
    _myEventLoop.processEvents();

    if(_myEventLoop.exec() == 0)
    {
        // DoSomething
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多