388bool QFutureWatcherBase::event(QEvent *event)
390 Q_D(QFutureWatcherBase);
391 if (event->type() == QEvent::FutureCallOut) {
392 QFutureCallOutEvent *callOutEvent =
static_cast<QFutureCallOutEvent *>(event);
393 d->sendCallOutEvent(callOutEvent);
396 return QObject::event(event);
413void QFutureWatcherBase::connectNotify(
const QMetaMethod &signal)
415 Q_D(QFutureWatcherBase);
416 static const QMetaMethod resultReadyAtSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::resultReadyAt);
417 if (signal == resultReadyAtSignal)
418 d->resultAtConnected.ref();
420 static const QMetaMethod finishedSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::finished);
421 if (signal == finishedSignal) {
422 if (futureInterface().isRunning()) {
425 qWarning(
"QFutureWatcher::connect: connecting after calling setFuture() is likely to produce race");
468void QFutureWatcherBasePrivate::postCallOutEvent(
const QFutureCallOutEvent &callOutEvent)
470 Q_Q(QFutureWatcherBase);
472 if (callOutEvent.callOutType == QFutureCallOutEvent::ResultsReady) {
473 if (pendingResultsReady.fetchAndAddRelaxed(1) >= maximumPendingResultsReady)
474 q->futureInterface().d->internal_setThrottled(
true);
477 QCoreApplication::postEvent(q, callOutEvent.clone());
485void QFutureWatcherBasePrivate::sendCallOutEvent(QFutureCallOutEvent *event)
487 Q_Q(QFutureWatcherBase);
489 switch (event->callOutType) {
490 case QFutureCallOutEvent::Started:
493 case QFutureCallOutEvent::Finished:
496 case QFutureCallOutEvent::Canceled:
497 pendingResultsReady.storeRelaxed(0);
500 case QFutureCallOutEvent::Suspending:
501 if (q->futureInterface().isCanceled())
503 emit q->suspending();
504#if QT_DEPRECATED_SINCE(6
, 0
)
506QT_WARNING_DISABLE_DEPRECATED
511 case QFutureCallOutEvent::Suspended:
512 if (q->futureInterface().isCanceled())
516 case QFutureCallOutEvent::Resumed:
517 if (q->futureInterface().isCanceled())
521 case QFutureCallOutEvent::ResultsReady: {
522 if (q->futureInterface().isCanceled())
525 if (pendingResultsReady.fetchAndAddRelaxed(-1) <= maximumPendingResultsReady)
526 q->futureInterface().setThrottled(
false);
528 const int beginIndex = event->index1;
529 const int endIndex = event->index2;
531 emit q->resultsReadyAt(beginIndex, endIndex);
533 if (resultAtConnected.loadRelaxed() <= 0)
536 for (
int i = beginIndex; i < endIndex; ++i)
537 emit q->resultReadyAt(i);
540 case QFutureCallOutEvent::Progress:
541 if (q->futureInterface().isCanceled())
544 emit q->progressValueChanged(event->index1);
545 if (!event->text.isNull())
546 emit q->progressTextChanged(event->text);
548 case QFutureCallOutEvent::ProgressRange:
549 emit q->progressRangeChanged(event->index1, event->index2);