15#include "private/qcoreapplication_p.h"
49 : _ref(initialRefCount), loopLevel(0), scopeLevel(0),
51 quitNow(
false), canWait(true), isAdopted(
false), requiresCoreApplication(true)
87 --pe.
receiver->d_func()->postedEvents;
88 pe.
event->m_posted =
false;
129 d_func()->running =
true;
132 d_func()->m_statusOrPendingObjects.setStatusAndClearList(
147 qFatal(
"QAdoptedThread::run(): Internal error, this implementation should never be called.");
156 isInFinish(
false), interruptionRequested(
false),
157 exited(
false), returnCode(-1),
158 stackSize(0), priority(
QThread::InheritPriority),
data(
d)
166#elif defined(Q_OS_RTEMS)
167 Q_CONSTINIT
static bool envStackSizeOk =
false;
173#if defined (Q_OS_WIN)
177 terminationEnabled =
true;
178 terminatePending =
false;
190 delete m_statusOrPendingObjects.list();
408 return data->thread.loadAcquire();
423 d->data->thread.storeRelaxed(
this);
434 d->data->thread.storeRelaxed(
this);
465 if (
d->running && !
d->finished && !
d->data->isAdopted)
466 qFatal(
"QThread: Destroyed while thread is still running");
468 d->data->thread.storeRelease(
nullptr);
482 return d->finished ||
d->isInFinish;
495 return d->running && !
d->isInFinish;
515 "cannot change stack size while the thread is running");
541 if (
auto pendingObjects =
list()) {
542 for (
auto obj: *pendingObjects)
544 delete pendingObjects;
547 data.store(encodeBindingStatus(status), std::memory_order_release);
569 d->m_statusOrPendingObjects.setStatusAndClearList(status);
570 d->data->quitNow =
false;
573 return d->returnCode;
578 int returnCode = eventLoop.
exec();
600 objectList =
new List();
601 objectList->reserve(8);
602 data.store(encodeList(objectList), std::memory_order_relaxed);
604 objectList->push_back(
object);
617 auto it = std::remove(objectList->begin(), objectList->end(),
object);
618 objectList->erase(
it, objectList->
end());
623 if (
auto status = m_statusOrPendingObjects.bindingStatus())
626 return m_statusOrPendingObjects.addObjectUnlessAlreadyStatus(
obj);
631 if (m_statusOrPendingObjects.bindingStatus())
634 m_statusOrPendingObjects.removeObject(
obj);
665 d->returnCode = returnCode;
666 d->data->quitNow =
true;
667 for (
int i = 0;
i <
d->data->eventLoops.size(); ++
i) {
669 eventLoop->
exit(returnCode);
724 qWarning(
"QThread::setPriority: Argument cannot be InheritPriority");
730 qWarning(
"QThread::setPriority: Cannot set priority, thread is not running");
733 d->setPriority(priority);
750 return Priority(
d->priority & 0xffff);
896 return d->data->eventLoops.size();
905 d->data->thread.storeRelaxed(
this);
943 d->data->quitNow =
true;
944 for (
int i = 0;
i <
d->data->eventLoops.size(); ++
i) {
946 eventLoop->
exit(returnCode);
961Qt::HANDLE QThread::currentThreadIdImpl() noexcept
1007 if (!
data && createIfNecessary) {
1012 data->isAdopted =
true;
1033 d->data->thread.storeRelaxed(
this);
1042 data->thread.storeRelease(
nullptr);
1067 return d->data->eventDispatcher.loadRelaxed();
1085 if (
d->data->hasEventDispatcher()) {
1086 qWarning(
"QThread::setEventDispatcher: An event dispatcher has already been created for this thread");
1092 qWarning(
"QThread::setEventDispatcher: Could not move event dispatcher to target thread");
1104#if QT_CONFIG(thread)
1135 qWarning(
"QThread::requestInterruption has no effect on the main thread");
1140 if (!
d->running ||
d->finished ||
d->isInFinish)
1142 d->interruptionRequested.store(
true, std::memory_order_relaxed);
1175 if (!
d->interruptionRequested.load(std::memory_order_relaxed))
1179 return d->running && !
d->finished && !
d->isInFinish;
1204#if QT_CONFIG(cxx11_future)
1205class QThreadCreateThread :
public QThread
1208 explicit QThreadCreateThread(std::future<void> &&
future)
1213 ~QThreadCreateThread()
1226 std::future<void> m_future;
1229QThread *QThread::createThreadImpl(std::future<void> &&
future)
1231 return new QThreadCreateThread(std::move(
future));
1253QDaemonThread::~QDaemonThread()
1261#include "moc_qthread.cpp"
QAdoptedThread(QThreadData *data=nullptr)
T loadRelaxed() const noexcept
Type loadAcquire() const noexcept
void storeRelease(Type newValue) noexcept
static QBasicAtomicPointer< QThread > theMainThread
int exec(ProcessEventsFlags flags=AllEvents)
Enters the main event loop and waits until exit() is called.
void exit(int returnCode=0)
Tells the event loop to exit with a return code.
qsizetype size() const noexcept
bool isEmpty() const noexcept
const QPostEvent & constLast() const noexcept
iterator insert(qsizetype i, parameter_type t)
const_reference at(qsizetype i) const noexcept
void append(parameter_type t)
void moveToThread(QThread *thread)
Changes the thread affinity for this object and its children.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
virtual bool event(QEvent *event)
This virtual function receives events to an object and should return true if the event e was recogniz...
QThread * thread() const
Returns the thread in which the object lives.
void addEvent(const QPostEvent &ev)
qsizetype insertionOffset
static Q_AUTOTEST_EXPORT QThreadData * current(bool createIfNecessary=true)
QAtomicPointer< QAbstractEventDispatcher > eventDispatcher
QThreadData(int initialRefCount=1)
bool requiresCoreApplication
static void clearCurrentThreadData()
QPostEventList postEventList
QAtomicPointer< QThread > thread
QAbstractEventDispatcher * createEventDispatcher()
static QAbstractEventDispatcher * createEventDispatcher(QThreadData *data)
QThreadPrivate(QThreadData *d=nullptr)
void removeObjectWithPendingBindingStatusChange(QObject *)
QBindingStatus * addObjectWithPendingBindingStatusChange(QObject *)
bool isInterruptionRequested() const
void start(Priority=InheritPriority)
QAbstractEventDispatcher * eventDispatcher() const
static int idealThreadCount() noexcept
bool event(QEvent *event) override
This virtual function receives events to an object and should return true if the event e was recogniz...
static QThread * currentThread()
static void yieldCurrentThread()
bool wait(QDeadlineTimer deadline=QDeadlineTimer(QDeadlineTimer::Forever))
QThread(QObject *parent=nullptr)
Priority priority() const
void finished(QPrivateSignal)
void setPriority(Priority priority)
void requestInterruption()
void setStackSize(uint stackSize)
void setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
void started(QPrivateSignal)
List * list() const noexcept
void removeObject(QObject *object)
void setStatusAndClearList(QBindingStatus *status) noexcept
QBindingStatus * addObjectUnlessAlreadyStatus(QObject *object)
QBindingStatus * bindingStatus() const noexcept
std::vector< QObject * > List
QSet< QString >::iterator it
Combined button and popup list for selecting options.
Q_AUTOTEST_EXPORT QBindingStatus * getBindingStatus(QBindingStatusAccessToken)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static QDBusError::ErrorType get(const char *name)
static Q_CONSTINIT QBasicAtomicInt running
GLuint64 GLenum void * handle
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
#define Q_ASSERT_X(cond, x, msg)
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
QFuture< void > future
[5]
QDeadlineTimer deadline(30s)
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent