TaskThreadPool - класс который управляет выполнением длительных задач¶
-
class
axioma.core.TaskThreadPool¶ Основная задача этого класса это запускать выполнение длительных пользовательских задач. Это даёт возможность выполнять вычисления в фоне, оставляя интерфейс отзывчивым. Результат выполнения задачи можно получить воспользовавшись методом
result()из интерфейса классаPythonProgressHandler-
globalInstance()¶ - Результат
Возвращает единственный объект класса
- Тип результата
-
start(task)¶ - Параметры
task (
PythonTask) – Пользовательская задача
Запускает выполнение пользовательской задачи. Владение задачей переходит к
TaskThreadPoolПредупреждение
Не рекомендуется запускать несколько задач параллельно если они могут менять общие данные. В противном случае пользователь должен использовать различные механизмы синхронизации и блокировок
Предупреждение
Запущенная задача будет выполняться не в основном потоке приложения. Поэтому внутри задачи нельзя поднимать никакие диалоги или окна. Вероятнее всего это приведёт к аварийному завершению приложения. Общаться с пользовательскими графическими элементами можно используя систему сигналов которую предоставляет Qt
-
Пример использования:
def user_heavy_function():
# делаем необходимые вычисления
return result
task = PythonTask(user_heavy_function)
progressHandler = task.progressHandler()
TaskThreadPool.globalInstance().start(task)
dialog = QProgressDialog()
progressHandler.finished.connect(dialog.close)
# проверяем не завершилась ли уже задача
if not progressHandler.isFinished():
dialog.exec_()
print(progressHandler.result())
Полный пример лежит в директории <Axioma.X>/share/axioma/python_samples/concurrent/CustomProgressDialog,
где <Axioma.X> - директория с установленным приложением Аксиома.
Т.к. функция start() сразу
возвращает поток управления, то чтобы дождаться результата
нужно блокировать дальнейшее выполнение скрипта. Например вызвав
exec_. Если во фрагменте ниже заменить
exec_() на open() то вместо результата мы получим None
TaskThreadPool.globalInstance().start(task)
# проверяем не завершилась ли уже задача
if not progressHandler.isFinished():
dialog.exec_()
print(progressHandler.result())