28 QObject::connect(&m_process, &QProcess::finished,
this, &QProcessScheduler::processNext);
29 QObject::connect(&m_process, &QProcess::errorOccurred,
this,
30 &QProcessScheduler::onErrorOccurred);
43 m_queue.enqueue(StartMarker{ id });
44 const int queueSize = m_queue.size();
45 for (
const auto &x : list) {
46 const QueueElement queueElement{ x };
47 if (!m_queue.contains(queueElement))
48 m_queue.enqueue(queueElement);
52 if (queueSize == m_queue.size()) {
56 m_queue.enqueue(EndMarker{ id });
57 if (!std::exchange(m_isRunning,
true))
58 QMetaObject::invokeMethod(
this, &QProcessScheduler::processNext, Qt::QueuedConnection);
81 auto removeQueueElementsForStartMarkerIt = [
this, &id](
auto begin) {
82 auto end = std::find_if(begin, m_queue.cend(),
83 std::bind(isEndMarkerOf, std::placeholders::_1, id));
86 if (end != m_queue.cend())
88 m_queue.erase(begin, end);
91 if (m_current != id) {
92 const auto begin = std::find_if(m_queue.cbegin(), m_queue.cend(),
93 std::bind(isStartMarkerOf, std::placeholders::_1, id));
94 removeQueueElementsForStartMarkerIt(begin);
100 QObject::disconnect(&m_process, &QProcess::finished,
this, &QProcessScheduler::processNext);
101 QObject::disconnect(&m_process, &QProcess::errorOccurred,
this,
102 &QProcessScheduler::onErrorOccurred);
105 m_process.waitForFinished();
106 removeQueueElementsForStartMarkerIt(m_queue.cbegin());
107 QObject::connect(&m_process, &QProcess::finished,
this, &QProcessScheduler::processNext);
108 QObject::connect(&m_process, &QProcess::errorOccurred,
this,
109 &QProcessScheduler::onErrorOccurred);
113 if (!std::exchange(m_isRunning,
true))
114 QMetaObject::invokeMethod(
this, &QProcessScheduler::processNext, Qt::QueuedConnection);