Назначение для запуска QFuture
Могу ли я назначить другой объект QFuture уже запущенному объекту QFuture? Как в примере ниже:
QFuture<int> future = QtConcurrent::run(function);
future = QtConcurrent::run(anotherFunciton); //assume that future is still running at this point
Я понимаю, что этот конкретный пример не имеет особого смысла, он просто ради примера. Безопасно ли делать такое задание, предполагая, что результат первой функции меня больше не интересует? Или я должен сначала отменить это? И если да, то должен ли я ждать отмены?
QFuture<int> future = QtConcurrent::run(function);
future.cancel();
future.waitForFinished(); //is waiting necessary?
future = QtConcurrent::run(anotherFunciton);
1 ответ
С http://doc.qt.io/qt-4.8/qtconcurrentrun.html:
Обратите внимание, что QFuture, возвращаемое QtConcurrent::run(), не поддерживает отмену, приостановку или создание отчетов о ходе выполнения. Возвращаемое QFuture может использоваться только для запроса статуса выполнения / завершения и возвращаемого значения функции.
Это означает, что даже если вы захотите, вы не сможете отменить свое QFuture. Кроме того, даже если отмена была разрешена, почему бы вам отменить ее, а затем ждать, пока она не будет завершена?
От http://doc.qt.io/qt-4.8/qthreadpool.html:
Потоки, которые не используются в течение определенного периода времени, истекают. Время ожидания по умолчанию составляет 30000 миллисекунд (30 секунд). Это можно изменить с помощью setExpiryTimeout(). Установка отрицательного тайм-аута истечения отключает механизм истечения.
Так как темы начались QtConcurrent::run()
управляются QThreadPool
класс, то при условии, что вы не указали отрицательный тайм-аут истечения, вы должны быть в состоянии future = QtConcurrent::run(anotherFunciton);
без проблем; исходный поток истекает, и он выходит. Эффективность этого, однако, сомнительна.