forked from qt-creator/qt-creator
TaskTree: Add synchronous invocation (Tasking::Sync)
Make it possible to mix synchronous and asynchronous calls
inside task tree.
Basically, it's a shortcut for:
bool syncMethod();
Group {
OnGroupSetup([syncMethod] { return syncMethod()
? TaskAction::StopWithDone
: TaskAction::StopWithError; })
}
Please note: similarly to Group, Sync isn't counted as a task
inside taskCount() and doesn't emit TaskTree::progressValueChanged()
when finished. It's being considered as a simple handler
that doesn't last long and shouldn't block the GUI thread.
Otherwise, use AsyncTask instead.
Change-Id: If71c5da2f9b202a69c41a555cc93d314476952f4
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -244,6 +244,16 @@ public:
|
|||||||
OnGroupError(const GroupEndHandler &handler) : TaskItem({{}, {}, handler}) {}
|
OnGroupError(const GroupEndHandler &handler) : TaskItem({{}, {}, handler}) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Synchronous invocation. Similarly to Group - isn't counted as a task inside taskCount()
|
||||||
|
class QTCREATOR_UTILS_EXPORT Sync : public Group
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using SynchronousMethod = std::function<bool()>;
|
||||||
|
Sync(const SynchronousMethod &sync)
|
||||||
|
: Group({OnGroupSetup([sync] { return sync() ? TaskAction::StopWithDone
|
||||||
|
: TaskAction::StopWithError; })}) {}
|
||||||
|
};
|
||||||
|
|
||||||
QTCREATOR_UTILS_EXPORT extern ParallelLimit sequential;
|
QTCREATOR_UTILS_EXPORT extern ParallelLimit sequential;
|
||||||
QTCREATOR_UTILS_EXPORT extern ParallelLimit parallel;
|
QTCREATOR_UTILS_EXPORT extern ParallelLimit parallel;
|
||||||
QTCREATOR_UTILS_EXPORT extern Workflow stopOnError;
|
QTCREATOR_UTILS_EXPORT extern Workflow stopOnError;
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ enum class Handler {
|
|||||||
Error,
|
Error,
|
||||||
GroupSetup,
|
GroupSetup,
|
||||||
GroupDone,
|
GroupDone,
|
||||||
GroupError
|
GroupError,
|
||||||
|
Sync
|
||||||
};
|
};
|
||||||
|
|
||||||
using Log = QList<QPair<int, Handler>>;
|
using Log = QList<QPair<int, Handler>>;
|
||||||
@@ -172,6 +173,9 @@ void tst_TaskTree::processTree_data()
|
|||||||
const auto groupError = [storage](int groupId) {
|
const auto groupError = [storage](int groupId) {
|
||||||
return [=] { storage->m_log.append({groupId, Handler::GroupError}); };
|
return [=] { storage->m_log.append({groupId, Handler::GroupError}); };
|
||||||
};
|
};
|
||||||
|
const auto setupSync = [storage](int syncId, bool success) {
|
||||||
|
return [=] { storage->m_log.append({syncId, Handler::Sync}); return success; };
|
||||||
|
};
|
||||||
|
|
||||||
const auto constructSimpleSequence = [=](const Workflow &policy) {
|
const auto constructSimpleSequence = [=](const Workflow &policy) {
|
||||||
return Group {
|
return Group {
|
||||||
@@ -988,6 +992,86 @@ void tst_TaskTree::processTree_data()
|
|||||||
QTest::newRow("DeeplyNestedParallelError")
|
QTest::newRow("DeeplyNestedParallelError")
|
||||||
<< TestData{storage, root, log, 5, OnStart::Running, OnDone::Failure};
|
<< TestData{storage, root, log, 5, OnStart::Running, OnDone::Failure};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const Group root {
|
||||||
|
Storage(storage),
|
||||||
|
Sync(setupSync(1, true)),
|
||||||
|
Sync(setupSync(2, true)),
|
||||||
|
Sync(setupSync(3, true)),
|
||||||
|
Sync(setupSync(4, true)),
|
||||||
|
Sync(setupSync(5, true))
|
||||||
|
};
|
||||||
|
const Log log {
|
||||||
|
{1, Handler::Sync},
|
||||||
|
{2, Handler::Sync},
|
||||||
|
{3, Handler::Sync},
|
||||||
|
{4, Handler::Sync},
|
||||||
|
{5, Handler::Sync}
|
||||||
|
};
|
||||||
|
QTest::newRow("SyncSequential")
|
||||||
|
<< TestData{storage, root, log, 0, OnStart::NotRunning, OnDone::Success};
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const Group root {
|
||||||
|
Storage(storage),
|
||||||
|
parallel,
|
||||||
|
Sync(setupSync(1, true)),
|
||||||
|
Sync(setupSync(2, true)),
|
||||||
|
Sync(setupSync(3, true)),
|
||||||
|
Sync(setupSync(4, true)),
|
||||||
|
Sync(setupSync(5, true))
|
||||||
|
};
|
||||||
|
const Log log {
|
||||||
|
{1, Handler::Sync},
|
||||||
|
{2, Handler::Sync},
|
||||||
|
{3, Handler::Sync},
|
||||||
|
{4, Handler::Sync},
|
||||||
|
{5, Handler::Sync}
|
||||||
|
};
|
||||||
|
QTest::newRow("SyncParallel")
|
||||||
|
<< TestData{storage, root, log, 0, OnStart::NotRunning, OnDone::Success};
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const Group root {
|
||||||
|
Storage(storage),
|
||||||
|
parallel,
|
||||||
|
Sync(setupSync(1, true)),
|
||||||
|
Sync(setupSync(2, true)),
|
||||||
|
Sync(setupSync(3, false)),
|
||||||
|
Sync(setupSync(4, true)),
|
||||||
|
Sync(setupSync(5, true))
|
||||||
|
};
|
||||||
|
const Log log {
|
||||||
|
{1, Handler::Sync},
|
||||||
|
{2, Handler::Sync},
|
||||||
|
{3, Handler::Sync}
|
||||||
|
};
|
||||||
|
QTest::newRow("SyncError")
|
||||||
|
<< TestData{storage, root, log, 0, OnStart::NotRunning, OnDone::Failure};
|
||||||
|
}
|
||||||
|
|
||||||
|
const Group root {
|
||||||
|
Storage(storage),
|
||||||
|
Sync(setupSync(1, true)),
|
||||||
|
Process(setupProcess(2)),
|
||||||
|
Sync(setupSync(3, true)),
|
||||||
|
Process(setupProcess(4)),
|
||||||
|
Sync(setupSync(5, true)),
|
||||||
|
OnGroupDone(groupDone(0))
|
||||||
|
};
|
||||||
|
const Log log {
|
||||||
|
{1, Handler::Sync},
|
||||||
|
{2, Handler::Setup},
|
||||||
|
{3, Handler::Sync},
|
||||||
|
{4, Handler::Setup},
|
||||||
|
{5, Handler::Sync},
|
||||||
|
{0, Handler::GroupDone}
|
||||||
|
};
|
||||||
|
QTest::newRow("SyncAndAsync")
|
||||||
|
<< TestData{storage, root, log, 2, OnStart::Running, OnDone::Success};
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_TaskTree::processTree()
|
void tst_TaskTree::processTree()
|
||||||
|
|||||||
Reference in New Issue
Block a user