Source code for mantidimaging.gui.dialogs.async_task.model
# Copyright (C) 2022 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from logging import getLogger
from typing import Callable, Optional, Set
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):
super().__init__()
self.task = TaskWorkerThread()
self.task.finished.connect(self._on_task_exit)
self.on_complete_function: Optional[Callable] = None
self.tracker: Optional[Set] = None
[docs]
def set_tracker(self, tracker: Set):
self.tracker = tracker
self.tracker.add(self)
[docs]
def do_execute_async(self):
"""
Start asynchronous execution.
"""
self.task.start()
@property
def task_is_running(self) -> bool:
return self.task.isRunning()
def _cleanup(self):
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):
"""
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()