2016-11-06 90 views
0

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

工作液在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代码使用谓词任何想法?

+2

哪里可以看到任何可以将回调传递给QaitCondition的文档?我没有看到任何东西。 http://doc.qt.io/qt-5/qwaitcondition.html我猜你只是在一个while循环中包装它。 while(!condition_to_test)qtwaitcondition.wait(); – xaxxon

+0

真正的问题是:既然你有一个使用标准C++的工作解决方案,为什么要通过转码来使用Qt来限制自己?有没有理由不能使用你的工作C++解决方案? – IInspectable

+0

@IInspectable这是一个桌面应用程序,因此使用Qt契约确保完全跨平台兼容 –

回答

1

由于编译器和@xaxxon已经指出,在QWaitCondition中没有这样的wait()过载。

如果你想在继续之前,你可以做这样的

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

你当然也可以将它放入一个辅助功能,需要一个QWaitConditionQMutexstd::function如果需要此办理登机手续的条件更多的地方。或者从QWaitCondition派生出来,加上做循环的重载。