diff options
author | Andrew Knight <andrew.knight@digia.com> | 2014-06-19 10:22:16 +0300 |
---|---|---|
committer | Andrew Knight <andrew.knight@digia.com> | 2014-06-25 16:34:39 +0200 |
commit | b46e48f1b72267d14fc4b9e1969f0fc0a4eb739e (patch) | |
tree | 29e23b5ab5bcd9bafdb62fbc67471eb111b6ceca /src/corelib/thread/qthread_p.h | |
parent | 50001dc801a695ecd1e6381ff159c0cf2f3c5b55 (diff) |
winrt: Use native threading
Instead of using std::thread, use the WinRT ThreadPool to manage
threads. This allows for setting the scheduling priority, and provides
a path to enable XAML integration (which requires Qt run on a background
thread).
QThread::terminate() is still unsupported, and only the winmain thread
can be adopted due to the behavior of the thread pool when creating
tasks from the GUI thread. The associated tests are now skipped, and
all other QThread tests pass.
Task-number: QTBUG-31397
Change-Id: Ib512a328412e1dffecdc836bc39de3ccd37afa13
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src/corelib/thread/qthread_p.h')
-rw-r--r-- | src/corelib/thread/qthread_p.h | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index e2951b125f..aec553113b 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -65,11 +65,6 @@ #include <algorithm> - -#ifdef Q_OS_WINRT -#include <thread> -#endif - QT_BEGIN_NAMESPACE class QAbstractEventDispatcher; @@ -138,6 +133,10 @@ private: #ifndef QT_NO_THREAD +#ifdef Q_OS_WINRT +namespace ABI { namespace Windows { namespace Foundation { struct IAsyncAction; } } } +#endif + class QThreadPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QThread) @@ -174,19 +173,23 @@ public: #endif // Q_OS_UNIX #ifdef Q_OS_WIN +# ifndef Q_OS_WINRT static unsigned int __stdcall start(void *); static void finish(void *, bool lockAnyway=true); +# else + HRESULT start(ABI::Windows::Foundation::IAsyncAction *); + void finish(bool lockAnyway = true); +# endif # ifndef Q_OS_WINRT Qt::HANDLE handle; - unsigned int id; # else - std::thread *handle; - std::thread::id id; + ABI::Windows::Foundation::IAsyncAction *handle; # endif + unsigned int id; int waiters; bool terminationEnabled, terminatePending; -# endif +#endif // Q_OS_WIN QThreadData *data; static void createEventDispatcher(QThreadData *data); |