387bool QFutureWatcherBase::event(QEvent *event)
389 Q_D(QFutureWatcherBase);
390 if (event->type() == QEvent::FutureCallOut) {
391 QFutureCallOutEvent *callOutEvent =
static_cast<QFutureCallOutEvent *>(event);
392 d->sendCallOutEvent(callOutEvent);
395 return QObject::event(event);
412void QFutureWatcherBase::connectNotify(
const QMetaMethod &signal)
414 Q_D(QFutureWatcherBase);
415 static const QMetaMethod resultReadyAtSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::resultReadyAt);
416 if (signal == resultReadyAtSignal)
417 d->resultAtConnected.ref();
419 static const QMetaMethod finishedSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::finished);
420 if (signal == finishedSignal) {
421 if (futureInterface().isRunning()) {
424 qWarning(
"QFutureWatcher::connect: connecting after calling setFuture() is likely to produce race");
467void QFutureWatcherBasePrivate::postCallOutEvent(
const QFutureCallOutEvent &callOutEvent)
469 Q_Q(QFutureWatcherBase);
471 if (callOutEvent.callOutType == QFutureCallOutEvent::ResultsReady) {
472 if (pendingResultsReady.fetchAndAddRelaxed(1) >= maximumPendingResultsReady)
473 q->futureInterface().d->internal_setThrottled(
true);
476 QCoreApplication::postEvent(q, callOutEvent.clone());
484void QFutureWatcherBasePrivate::sendCallOutEvent(QFutureCallOutEvent *event)
486 Q_Q(QFutureWatcherBase);
488 switch (event->callOutType) {
489 case QFutureCallOutEvent::Started:
492 case QFutureCallOutEvent::Finished:
495 case QFutureCallOutEvent::Canceled:
496 pendingResultsReady.storeRelaxed(0);
499 case QFutureCallOutEvent::Suspending:
500 if (q->futureInterface().isCanceled())
502 emit q->suspending();
503#if QT_DEPRECATED_SINCE(6
, 0
)
505QT_WARNING_DISABLE_DEPRECATED
510 case QFutureCallOutEvent::Suspended:
511 if (q->futureInterface().isCanceled())
515 case QFutureCallOutEvent::Resumed:
516 if (q->futureInterface().isCanceled())
520 case QFutureCallOutEvent::ResultsReady: {
521 if (q->futureInterface().isCanceled())
524 if (pendingResultsReady.fetchAndAddRelaxed(-1) <= maximumPendingResultsReady)
525 q->futureInterface().setThrottled(
false);
527 const int beginIndex = event->index1;
528 const int endIndex = event->index2;
530 emit q->resultsReadyAt(beginIndex, endIndex);
532 if (resultAtConnected.loadRelaxed() <= 0)
535 for (
int i = beginIndex; i < endIndex; ++i)
536 emit q->resultReadyAt(i);
539 case QFutureCallOutEvent::Progress:
540 if (q->futureInterface().isCanceled())
543 emit q->progressValueChanged(event->index1);
544 if (!event->text.isNull())
545 emit q->progressTextChanged(event->text);
547 case QFutureCallOutEvent::ProgressRange:
548 emit q->progressRangeChanged(event->index1, event->index2);