diff options
Diffstat (limited to 'src/corelib/kernel/qeventdispatcher_winrt.cpp')
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_winrt.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index 33753ed507..600c6c38fd 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -43,6 +43,8 @@ #include <QtCore/QThread> #include <QtCore/QHash> #include <QtCore/QMutex> +#include <QtCore/QSemaphore> +#include <QtCore/QSharedPointer> #include <QtCore/qfunctions_winrt.h> #include <private/qabstracteventdispatcher_p.h> #include <private/qcoreapplication_p.h> @@ -293,6 +295,26 @@ HRESULT QEventDispatcherWinRT::runOnXamlThread(const std::function<HRESULT ()> & return QWinRTFunctions::await(op); } +HRESULT QEventDispatcherWinRT::runOnMainThread(const std::function<HRESULT()> &delegate, int timeout) +{ + if (QThread::currentThread() == QCoreApplication::instance()->thread()) + return delegate(); + + auto semaphore = QSharedPointer<QSemaphore>(new QSemaphore); + auto ptrSemaphore = new QSharedPointer<QSemaphore>(semaphore); + auto result = QSharedPointer<HRESULT>(new HRESULT); + auto ptrResult = new QSharedPointer<HRESULT>(result); + + QMetaObject::invokeMethod(QCoreApplication::instance(), [delegate, ptrSemaphore, ptrResult]() { + **ptrResult = delegate(); + delete ptrResult; + (*ptrSemaphore)->release(); + delete ptrSemaphore; + }, nullptr); + + return semaphore->tryAcquire(1, timeout) ? *result : E_FAIL; +} + bool QEventDispatcherWinRT::processEvents(QEventLoop::ProcessEventsFlags flags) { Q_D(QEventDispatcherWinRT); |