Назначение для запуска 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); без проблем; исходный поток истекает, и он выходит. Эффективность этого, однако, сомнительна.

Другие вопросы по тегам