Фон
У меня есть QObject (myClass
), который работает в своем собственном потоке. Пользовательский интерфейс может вызвать длительный интервал в myClass
. Этот слот будет обрабатывать вещи, обновлять интерфейс, обрабатывать больше вещей, а затем обновлять переменные, используемые для фоновой обработки. Если слот запускается быстрее, чем он может обработать, первое обновление пользовательского интерфейса будет происходить быстро, но последующие обновления должны будут ждать (так как myClass
по-прежнему обрабатывает перебор y()
& z()
).
void myClass::mySlot() {
x(); // Fast
emit updateUI();
y(); // Slow
z(); // Slow
emit processingComplete();
}
Чтобы преодолеть это, я использовал QtConcurrent::run
для медленной обработки, чтобы последующие обновления также быстро обновляли пользовательский интерфейс (так как им не нужно ждать y()
& z()
).
void myClass::mySlot() {
x(); // Fast
emit updateUI();
// future is a member variable of myClass of type QFuture<void>
future = QtConcurrent::run([&]() {
y(); // Slow
z(); // Slow
emit processingComplete();
});
}
Я пытался сделать код чище, используя cancel()
, если поток все еще работает, но он не работает как "... будущее, возвращаемое QtConcurrent :: run () нельзя отменить "
...
emit updateUI();
if(future.isRunning())
future.cancel();
future.waitForFinished()
future = QtConcurrent::run([&]() {
...
Вопросы
- Безопасно ли переназначение работающего
QFuture<T>
при использовании QMutexLocker
? В этом ответе утверждается, что это безопасно, но не распространяется на мьютексы. - Будут ли «перезаписанные» потоки работать в фоновом режиме, осиротеть, до истечения времени ожидания или прекратят выполнение независимо от строка, на которой они находятся?
- Можно ли перезапустить
QFuture<T>
с начала его выполнения (если да, можно ли перезапустить его независимо от его состояния: запущено / завершено / отменено / приостановлено)? - Существуют ли другие обходные пути, если переназначение не безопасно? (Я не могу использовать это решение , поскольку
y()
& z()
являются линейными, а не петлями).
Предположим, что приведенный выше код является единственным местом, где обращается к переменной future
.