2016-11-06 3 views
0

Ich schreibe einige Threads in Qt und ich kann nicht herausfinden, wie man ein Prädikat an meine Zustandsvariable weiterleitet, um sich vor einem unerwünschten Aufwachen zu schützen.Übergeben Sie ein Prädikat an QWaitCondition?

Arbeitslösung in 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-Äquivalent:

QMutex mu; 
QWaitCondition cond; 

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

Fehler:

"no matching member function for call to wait" 

Alle Ideen, wie ein Prädikat in diesem Qt-Code verwenden?

+2

Wo sehen Sie Dokumentation, die Sie einen Rückruf an QaitCondition übergeben können? Ich sehe nichts. http://doc.qt.io/qt-5/qwaitcondition.html Ich schätze, Sie wickeln es einfach in eine While-Schleife. while (! condition_to_test) qtwaitcondition.wait(); – xaxxon

+0

Die wirkliche Frage ist: Da Sie eine funktionierende Lösung haben, die Standard C++ verwendet, warum beschränken Sie sich, indem Sie es umwandeln, um Qt zu verwenden? Gibt es einen Grund, warum Sie Ihre funktionierende C++ Lösung nicht verwenden können? – IInspectable

+0

@Intensible Dies ist für eine Desktop-App, daher Qt-Verträge verwenden, um sicherzustellen, vollständig plattformübergreifend kompatibel –

Antwort

1

Wie der Compiler und @xaxxon bereits festgestellt haben, gibt es keine wait() Überlastung in QWaitCondition.

Wenn Sie eine Bedingung überprüfen, bevor auf Sie gehen können es tun, wie diese

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

können Sie natürlich, dass in eine Helferfunktion setzen, die eine QWaitCondition nimmt, QMutex und std::function, wenn Sie diese brauchen in mehr Orte. Oder leiten Sie von QWaitCondition hinzu, indem Sie die Überladung hinzufügen, indem Sie die obige Schleife ausführen.

Verwandte Themen