Назначение для запуска 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#expiryTimeout-prop:

Потоки, которые не используются в течение определенного периода времени, истекают.
время истечения по умолчанию составляет 30000 миллисекунд (30 секунд). Это может быть
изменено с помощью setExpiryTimeout (). Установка отрицательного тайм-аута истечения
отключает механизм истечения срока действия.

Так как темы начаты QtConcurrent::run() управляются QThreadPool класс, то при условии, что вы не указали отрицательный тайм-аут истечения, вы должны быть в состоянии future = QtConcurrent::run(anotherFunciton); без проблем; исходный поток истекает, и он выходит. Эффективность этого, однако, сомнительна.

1

Другие решения


По вопросам рекламы [email protected]