390bool QFutureWatcherBase::event(QEvent *event)
392 Q_D(QFutureWatcherBase);
393 if (event->type() == QEvent::FutureCallOut) {
394 QFutureCallOutEvent *callOutEvent =
static_cast<QFutureCallOutEvent *>(event);
395 d->sendCallOutEvent(callOutEvent);
398 return QObject::event(event);
415void QFutureWatcherBase::connectNotify(
const QMetaMethod &signal)
417 Q_D(QFutureWatcherBase);
418 static const QMetaMethod resultReadyAtSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::resultReadyAt);
419 if (signal == resultReadyAtSignal)
420 d->resultAtConnected.ref();
422 static const QMetaMethod finishedSignal = QMetaMethod::fromSignal(&QFutureWatcherBase::finished);
423 if (signal == finishedSignal) {
424 if (futureInterface().isRunning()) {
427 qWarning(
"QFutureWatcher::connect: connecting after calling setFuture() is likely to produce race");
470void QFutureWatcherBasePrivate::postCallOutEvent(
const QFutureCallOutEvent &callOutEvent)
472 Q_Q(QFutureWatcherBase);
474 if (callOutEvent.callOutType == QFutureCallOutEvent::ResultsReady) {
475 if (pendingResultsReady.fetchAndAddRelaxed(1) >= maximumPendingResultsReady)
476 q->futureInterface().d->internal_setThrottled(
true);
479 QCoreApplication::postEvent(q, callOutEvent.clone());
487void QFutureWatcherBasePrivate::sendCallOutEvent(QFutureCallOutEvent *event)
489 Q_Q(QFutureWatcherBase);
491 switch (event->callOutType) {
492 case QFutureCallOutEvent::Started:
495 case QFutureCallOutEvent::Finished:
498 case QFutureCallOutEvent::Canceled:
499 pendingResultsReady.storeRelaxed(0);
502 case QFutureCallOutEvent::Suspending:
503 if (q->futureInterface().isCanceled())
505 emit q->suspending();
506#if QT_DEPRECATED_SINCE(6
, 0
)
508QT_WARNING_DISABLE_DEPRECATED
513 case QFutureCallOutEvent::Suspended:
514 if (q->futureInterface().isCanceled())
518 case QFutureCallOutEvent::Resumed:
519 if (q->futureInterface().isCanceled())
523 case QFutureCallOutEvent::ResultsReady: {
524 if (q->futureInterface().isCanceled())
527 if (pendingResultsReady.fetchAndAddRelaxed(-1) <= maximumPendingResultsReady)
528 q->futureInterface().setThrottled(
false);
530 const int beginIndex = event->index1;
531 const int endIndex = event->index2;
533 emit q->resultsReadyAt(beginIndex, endIndex);
535 if (resultAtConnected.loadRelaxed() <= 0)
538 for (
int i = beginIndex; i < endIndex; ++i)
539 emit q->resultReadyAt(i);
542 case QFutureCallOutEvent::Progress:
543 if (q->futureInterface().isCanceled())
546 emit q->progressValueChanged(event->index1);
547 if (!event->text.isNull())
548 emit q->progressTextChanged(event->text);
550 case QFutureCallOutEvent::ProgressRange:
551 emit q->progressRangeChanged(event->index1, event->index2);