Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmlthread_stub.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmlthread_p.h"
5
6#include <private/qfieldlist_p.h>
7#include <private/qtqmlglobal_p.h>
8
9#include <QtCore/qcoreapplication.h>
10#include <QtCore/qcoreevent.h>
11#include <QtCore/qthread.h>
12
13#if QT_CONFIG(qml_type_loader_thread)
14#error "The QQmlThread stub is for the case of !qml_type_loader_thread"
15#endif
16
18
19class QQmlThreadPrivate : public QObject
20{
21public:
23
24 QQmlThreadPrivate(QQmlThread *q) : q(q) { setObjectName(QStringLiteral("QQmlThread")); }
25
26 bool event(QEvent *e) override
27 {
28 if (e->type() == QEvent::User) {
29 m_processing = true;
30
31 while (!m_messages.isEmpty()) {
32 QQmlThread::Message *message = m_messages.takeFirst();
33 message->call(q);
34 delete message;
35 }
36
37 m_processing = false;
38 }
39 return QObject::event(e);
40 }
41
43 QQmlThread *q = nullptr;
44
45 bool m_processing = false; // Set when processing messages
46};
47
49QQmlThread::~QQmlThread() { delete d; }
50
51void QQmlThread::startup() {}
52void QQmlThread::shutdown() {}
53
54void QQmlThread::lock() {}
55void QQmlThread::unlock() {}
56void QQmlThread::wakeOne() {}
57void QQmlThread::wait() {}
58
59QThread *QQmlThread::thread() const
60{
61 return d->thread();
62}
63
65{
66 return d;
67}
68
69bool QQmlThread::isThisThread() const
70{
71 return d->thread()->isCurrentThread();
72}
73
74bool QQmlThread::isParentThread() const
75{
76 return d->thread()->isCurrentThread();
77}
78
79void QQmlThread::internalCallMethodInThread(Message *message)
80{
81 internalCallMethodInMain(message);
82}
83
84void QQmlThread::internalCallMethodInMain(Message *message)
85{
86 message->call(this);
87 delete message;
88}
89
90void QQmlThread::internalPostMethodToThread(Message *message)
91{
92 internalPostMethodToMain(message);
93}
94
95void QQmlThread::internalPostMethodToMain(Message *message)
96{
97 const bool wasEmpty = d->m_messages.isEmpty();
98 d->m_messages.append(message);
99 if (wasEmpty && !d->m_processing)
100 QCoreApplication::postEvent(d, new QEvent(QEvent::User));
101}
102
104
106{
107 while (!d->m_messages.isEmpty())
108 delete d->m_messages.takeFirst();
109}
110
111QT_END_NAMESPACE
QQmlThreadPrivate(QQmlThread *q)
QFieldList< QQmlThread::Message, &QQmlThread::Message::next > MessageList
bool event(QEvent *e) override
This virtual function receives events to an object and should return true if the event e was recogniz...
QThread * thread() const
bool isThisThread() const
void waitForNextMessage()
bool isParentThread() const
virtual ~QQmlThread()
QObject * threadObject() const
And object living in the QML thread, in case you want to parent other objects to it.