diff --git a/include/wx/thread.h b/include/wx/thread.h index 796a7dd188..086007f826 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -344,6 +344,19 @@ public: // the lock on the associated mutex object, before returning. wxCondError Wait(); + // std::condition_variable-like variant that evaluates the associated condition + template + wxCondError Wait(const Functor& predicate) + { + while ( !predicate() ) + { + wxCondError e = Wait(); + if ( e != wxCOND_NO_ERROR ) + return e; + } + return wxCOND_NO_ERROR; + } + // exactly as Wait() except that it may also return if the specified // timeout elapses even if the condition hasn't been signalled: in this // case, the return value is wxCOND_TIMEOUT, otherwise (i.e. in case of a diff --git a/interface/wx/thread.h b/interface/wx/thread.h index 5ec3a58a8c..61becf5847 100644 --- a/interface/wx/thread.h +++ b/interface/wx/thread.h @@ -169,6 +169,33 @@ public: */ wxCondError Wait(); + /** + Waits until the condition is signalled and the associated condition true. + + This is a convenience overload that may be used to ignore spurious + awakenings while waiting for a specific condition to become true. + + Equivalent to + @code + while ( !predicate() ) + { + wxCondError e = Wait(); + if ( e != wxCOND_NO_ERROR ) + return e; + } + return wxCOND_NO_ERROR; + @endcode + + The predicate would typically be a C++11 lambda: + @code + condvar.Wait([]{return value == 1;}); + @endcode + + @since 3.0 + */ + template + wxCondError Wait(const Functor& predicate); + /** Waits until the condition is signalled or the timeout has elapsed.