【问题标题】:Passing a predicate to QWaitCondition?将谓词传递给 QWaitCondition?
【发布时间】:2017-03-19 15:25:16
【问题描述】:

我正在 Qt 中编写一些线程,但我不知道如何将谓词传递给我的条件变量以防止虚假唤醒。

C++ 中的工作解决方案:

std::mutex(mu);
std::condition_variable cond;

std::unique_lock<mutex> alpha_lock(mu);
cond.wait(alpha_lock, [](){ return //some condition;});
alpha_lock.unlock();

//Continue to do stuff...

Qt 等价物:

QMutex mu;
QWaitCondition cond;

QMutexLocker alpha_lock&(mu);
cond.wait(&mu, [](){return //some condition;})

错误:

"no matching member function for call to wait"

关于如何在这个 Qt 代码中使用谓词的任何想法?

【问题讨论】:

  • 您在哪里可以看到可以将回调传递给 QaitCondition 的任何文档?我什么也没看到。 doc.qt.io/qt-5/qwaitcondition.html 我猜你只是将它包装在一个while循环中。 while (!condition_to_test) qtwaitcondition.wait();
  • 真正的问题是:既然你有一个使用标准 C++ 的工作解决方案,你为什么要通过转码来限制自己使用 Qt?您是否有理由无法使用您的 C++ 解决方案?
  • @IInspectable 这是一个桌面应用程序,因此使用 Qt 合约来确保完全跨平台兼容
  • Qt 肯定不比标准 C++ 更便携。如果有的话,那就是反过来了。使用标准 C++ 可确保您可以为任何平台编译程序,只要有符合标准的 C++ 编译器。
  • @IInspectable 一个区别是 Qt 的线程类也可用于不支持 C++11 的编译器。

标签: c++ qt mutex condition-variable


【解决方案1】:

正如编译器和@xaxxon 已经指出的那样,QWaitCondition 中没有这样的wait() 重载。

如果你想在继续之前检查一个条件,你可以这样做

while (!condition()) {
    cond.wait(mutex);
}

如果您在更多地方需要它,当然可以将它放入一个辅助函数中,该函数采用 QWaitConditionQMutexstd::function。或者从QWaitCondition 派生,添加执行上述循环的重载。

【讨论】:

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