forked from qt-creator/qt-creator
Introduce Utils::FutureSynchronizer
The API is nearly the same as QFutureSynchronizer. The differences are: 1. We don't make this class a template class, however, we are leaving some template methods, like addFuture(). For the scope of future synchronizing there is no need for QFuture<T> API, the QFuture<void> is sufficient. 2. Renamed cancelOnWait() getter to isCancelOnWait() in order to conform more to Qt API naming rules. 3. Removed futures() getter and provided isEmpty() instead. 4. Removed c'tor that takes a future and setFuture(). These 2 methods were superfluous and may easily be substituted with other methods from the existing API. The additional feature is about flushing finished futures. This can be done on demand by a call to flushFinishedFutures(), or is done automatically on every call to addFuture(). Change-Id: I6a323c9481eeeea9235e6b6e3048cef02873da08 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -59,6 +59,7 @@ add_qtc_library(Utils
|
|||||||
fixedsizeclicklabel.cpp fixedsizeclicklabel.h
|
fixedsizeclicklabel.cpp fixedsizeclicklabel.h
|
||||||
flowlayout.cpp flowlayout.h
|
flowlayout.cpp flowlayout.h
|
||||||
functiontraits.h
|
functiontraits.h
|
||||||
|
futuresynchronizer.cpp futuresynchronizer.h
|
||||||
fuzzymatcher.cpp fuzzymatcher.h
|
fuzzymatcher.cpp fuzzymatcher.h
|
||||||
genericconstants.h
|
genericconstants.h
|
||||||
globalfilechangeblocker.cpp globalfilechangeblocker.h
|
globalfilechangeblocker.cpp globalfilechangeblocker.h
|
||||||
|
81
src/libs/utils/futuresynchronizer.cpp
Normal file
81
src/libs/utils/futuresynchronizer.cpp
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2021 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator.
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "futuresynchronizer.h"
|
||||||
|
|
||||||
|
/*! \class Utils::FutureSynchronizer
|
||||||
|
|
||||||
|
\brief The FutureSynchronizer is an enhanced version of QFutureSynchronizer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Utils {
|
||||||
|
|
||||||
|
FutureSynchronizer::~FutureSynchronizer()
|
||||||
|
{
|
||||||
|
waitForFinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FutureSynchronizer::isEmpty() const
|
||||||
|
{
|
||||||
|
return m_futures.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FutureSynchronizer::waitForFinished()
|
||||||
|
{
|
||||||
|
if (m_cancelOnWait) {
|
||||||
|
for (QFuture<void> &future : m_futures)
|
||||||
|
future.cancel();
|
||||||
|
}
|
||||||
|
for (QFuture<void> &future : m_futures)
|
||||||
|
future.waitForFinished();
|
||||||
|
clearFutures();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FutureSynchronizer::clearFutures()
|
||||||
|
{
|
||||||
|
m_futures.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FutureSynchronizer::setCancelOnWait(bool enabled)
|
||||||
|
{
|
||||||
|
m_cancelOnWait = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FutureSynchronizer::isCancelOnWait() const
|
||||||
|
{
|
||||||
|
return m_cancelOnWait;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FutureSynchronizer::flushFinishedFutures()
|
||||||
|
{
|
||||||
|
QList<QFuture<void>> newFutures;
|
||||||
|
for (const QFuture<void> &future : qAsConst(m_futures)) {
|
||||||
|
if (!future.isFinished())
|
||||||
|
newFutures.append(future);
|
||||||
|
}
|
||||||
|
m_futures = newFutures;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Utils
|
65
src/libs/utils/futuresynchronizer.h
Normal file
65
src/libs/utils/futuresynchronizer.h
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2021 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator.
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "utils_global.h"
|
||||||
|
#include <QtGlobal>
|
||||||
|
|
||||||
|
#include <QFuture>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
|
namespace Utils {
|
||||||
|
|
||||||
|
class QTCREATOR_UTILS_EXPORT FutureSynchronizer final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FutureSynchronizer() = default;
|
||||||
|
~FutureSynchronizer();
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void addFuture(const QFuture<T> &future)
|
||||||
|
{
|
||||||
|
m_futures.append(QFuture<void>(future));
|
||||||
|
flushFinishedFutures();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isEmpty() const;
|
||||||
|
|
||||||
|
void waitForFinished();
|
||||||
|
void clearFutures();
|
||||||
|
|
||||||
|
void setCancelOnWait(bool enabled);
|
||||||
|
bool isCancelOnWait() const; // TODO: The original contained cancelOnWait, what suggests action, not a getter
|
||||||
|
|
||||||
|
void flushFinishedFutures();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
QList<QFuture<void>> m_futures;
|
||||||
|
bool m_cancelOnWait = false; // TODO: True default makes more sense...
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Utils
|
@@ -141,6 +141,7 @@ SOURCES += \
|
|||||||
$$PWD/aspects.cpp \
|
$$PWD/aspects.cpp \
|
||||||
$$PWD/layoutbuilder.cpp \
|
$$PWD/layoutbuilder.cpp \
|
||||||
$$PWD/variablechooser.cpp \
|
$$PWD/variablechooser.cpp \
|
||||||
|
$$PWD/futuresynchronizer.cpp \
|
||||||
$$PWD/qtcsettings.cpp
|
$$PWD/qtcsettings.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
@@ -298,6 +299,7 @@ HEADERS += \
|
|||||||
$$PWD/layoutbuilder.h \
|
$$PWD/layoutbuilder.h \
|
||||||
$$PWD/variablechooser.h \
|
$$PWD/variablechooser.h \
|
||||||
$$PWD/set_algorithm.h \
|
$$PWD/set_algorithm.h \
|
||||||
|
$$PWD/futuresynchronizer.h \
|
||||||
$$PWD/qtcsettings.h
|
$$PWD/qtcsettings.h
|
||||||
|
|
||||||
FORMS += $$PWD/filewizardpage.ui \
|
FORMS += $$PWD/filewizardpage.ui \
|
||||||
|
@@ -129,6 +129,8 @@ Project {
|
|||||||
"flowlayout.cpp",
|
"flowlayout.cpp",
|
||||||
"flowlayout.h",
|
"flowlayout.h",
|
||||||
"functiontraits.h",
|
"functiontraits.h",
|
||||||
|
"futuresynchronizer.cpp",
|
||||||
|
"futuresynchronizer.h",
|
||||||
"fuzzymatcher.cpp",
|
"fuzzymatcher.cpp",
|
||||||
"fuzzymatcher.h",
|
"fuzzymatcher.h",
|
||||||
"globalfilechangeblocker.cpp",
|
"globalfilechangeblocker.cpp",
|
||||||
|
Reference in New Issue
Block a user