TaskThreadPool - класс который управляет выполнением длительных задач

class axioma.core.TaskThreadPool

Основная задача этого класса это запускать выполнение длительных пользовательских задач. Это даёт возможность выполнять вычисления в фоне, оставляя интерфейс отзывчивым. Результат выполнения задачи можно получить воспользовавшись методом result() из интерфейса класса PythonProgressHandler

globalInstance()
Результат

Возвращает единственный объект класса

Тип результата

TaskThreadPool

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())