Source code for mantidimaging.gui.dialogs.async_task.model
# Copyright (C) 2024 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from __future__ import annotations
from logging import getLogger
from collections.abc import Callable
from PyQt5.QtCore import QObject, pyqtSignal
from .task import TaskWorkerThread
[docs]
class AsyncTaskDialogModel(QObject):
# Signal emitted when task processing has terminated
task_done = pyqtSignal(bool)
def __init__(self) -> None:
super().__init__()
self.task = TaskWorkerThread()
self.task.finished.connect(self._on_task_exit)
self.on_complete_function: Callable | None = None
self.tracker: set | None = None
[docs]
def set_tracker(self, tracker: set):
self.tracker = tracker
self.tracker.add(self)
[docs]
def do_execute_async(self) -> None:
"""
Start asynchronous execution.
"""
self.task.start()
@property
def task_is_running(self) -> bool:
return self.task.isRunning()
def _cleanup(self) -> None:
if self.tracker is not None:
self.tracker.remove(self)
self.on_complete_function = None
self.task.task_function = None
def _on_task_exit(self) -> None:
"""
Handler for task thread completion.
Forwards task_done signal and calls post processing function (if
provided).
"""
log = getLogger(__name__)
# Emit on complete function
self.task_done.emit(self.task.was_successful())
# Call post process function
if self.on_complete_function is not None:
try:
self.on_complete_function(self.task)
except Exception:
log.exception("Failed to run task completion callback")
raise
finally:
self._cleanup()
else:
self._cleanup()