winrt: Fix core dispatcher lookup

The core dispatcher lookup should be performed from the constructor
in all cases but the first (WinMain) thread, and only rechecked if the
thread changes.

Change-Id: I05f0c15b3e199994aa5d740b2092b42fb8d2f596
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
This commit is contained in:
Andrew Knight 2014-08-11 00:35:47 +03:00
parent 57d9eb2b77
commit 34198cedbe

View File

@ -136,11 +136,42 @@ private:
QPointer<QThread> thread;
bool interrupt;
void fetchCoreDispatcher()
{
ComPtr<ICoreImmersiveApplication> application;
HRESULT hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(),
IID_PPV_ARGS(&application));
RETURN_VOID_IF_FAILED("Failed to get the application factory");
ComPtr<ICoreApplicationView> view;
hr = application->get_MainView(&view);
RETURN_VOID_IF_FAILED("Failed to get the main view");
ComPtr<ICoreWindow> window;
hr = view->get_CoreWindow(&window);
RETURN_VOID_IF_FAILED("Failed to get the core window");
hr = window->get_Dispatcher(&coreDispatcher);
RETURN_VOID_IF_FAILED("Failed to get the core dispatcher");
thread = QThread::currentThread();
}
};
QEventDispatcherWinRT::QEventDispatcherWinRT(QObject *parent)
: QAbstractEventDispatcher(*new QEventDispatcherWinRTPrivate, parent)
{
Q_D(QEventDispatcherWinRT);
// Special treatment for the WinMain thread, as it is created before the UI
static bool firstThread = true;
if (firstThread) {
firstThread = false;
return;
}
d->fetchCoreDispatcher();
}
QEventDispatcherWinRT::QEventDispatcherWinRT(QEventDispatcherWinRTPrivate &dd, QObject *parent)
@ -155,25 +186,8 @@ bool QEventDispatcherWinRT::processEvents(QEventLoop::ProcessEventsFlags flags)
{
Q_D(QEventDispatcherWinRT);
if (d->thread != QThread::currentThread()) {
ComPtr<ICoreImmersiveApplication> application;
HRESULT hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(),
IID_PPV_ARGS(&application));
RETURN_FALSE_IF_FAILED("Failed to get the application factory");
ComPtr<ICoreApplicationView> view;
hr = application->get_MainView(&view);
RETURN_FALSE_IF_FAILED("Failed to get the main view");
ComPtr<ICoreWindow> window;
hr = view->get_CoreWindow(&window);
RETURN_FALSE_IF_FAILED("Failed to get the core window");
hr = window->get_Dispatcher(&d->coreDispatcher);
RETURN_FALSE_IF_FAILED("Failed to get the core dispatcher");
d->thread = QThread::currentThread();
}
if (d->thread != QThread::currentThread())
d->fetchCoreDispatcher();
bool didProcess = false;
forever {