File indexing completed on 2026-09-17 09:24:55
0001
0002
0003
0004
0005 #ifndef QFUTURESYNCHRONIZER_H
0006 #define QFUTURESYNCHRONIZER_H
0007
0008 #include <QtCore/qfuture.h>
0009
0010 QT_REQUIRE_CONFIG(future);
0011
0012 QT_BEGIN_NAMESPACE
0013
0014
0015 template <typename T>
0016 class QFutureSynchronizer
0017 {
0018 Q_DISABLE_COPY(QFutureSynchronizer)
0019
0020 public:
0021 Q_NODISCARD_CTOR QFutureSynchronizer() : m_cancelOnWait(false) { }
0022 Q_NODISCARD_CTOR_X("Use future.waitForFinished() instead.")
0023 explicit QFutureSynchronizer(QFuture<T> future)
0024 : m_cancelOnWait(false)
0025 { addFuture(std::move(future)); }
0026 ~QFutureSynchronizer() { waitForFinished(); }
0027
0028 void setFuture(QFuture<T> future)
0029 {
0030 waitForFinished();
0031 m_futures.clear();
0032 addFuture(std::move(future));
0033 }
0034
0035 void addFuture(QFuture<T> future)
0036 {
0037 m_futures.append(std::move(future));
0038 }
0039
0040 void waitForFinished()
0041 {
0042 if (m_cancelOnWait) {
0043 for (int i = 0; i < m_futures.size(); ++i) {
0044 m_futures[i].cancel();
0045 }
0046 }
0047
0048 for (int i = 0; i < m_futures.size(); ++i) {
0049 m_futures[i].waitForFinished();
0050 }
0051 }
0052
0053 void clearFutures()
0054 {
0055 m_futures.clear();
0056 }
0057
0058 QList<QFuture<T> > futures() const
0059 {
0060 return m_futures;
0061 }
0062
0063 void setCancelOnWait(bool enabled)
0064 {
0065 m_cancelOnWait = enabled;
0066 }
0067
0068 bool cancelOnWait() const
0069 {
0070 return m_cancelOnWait;
0071 }
0072
0073 protected:
0074 QList<QFuture<T>> m_futures;
0075 bool m_cancelOnWait;
0076 };
0077
0078 QT_END_NAMESPACE
0079
0080 #endif