Source code for mantidimaging.gui.dialogs.async_task.task
# 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
from PyQt5.QtCore import QThread
from mantidimaging.core.utility.func_call import call_with_known_parameters
[docs]
class TaskWorkerThread(QThread):
"""
Thread for running tasks asynchronously to the GUI.
Intended for internal use within this module only.
Usage:
t = TaskWorkerThread(parent)
t.task_function = ...
t.finished.connect(...)
t.start()
On completion inspect:
t.result
t.error
"""
task_function = Optional[Callable]
error = Optional[Exception]
def __init__(self, parent=None):
super().__init__(parent)
self.task_function = None
self.kwargs = {}
self.result = None
self.error = None
[docs]
def run(self) -> None:
log = getLogger(__name__)
try:
if self.task_function is None:
raise ValueError("No task function provided")
self.result = call_with_known_parameters(self.task_function, **self.kwargs)
except Exception as e:
log.exception("Failed to execute task")
self.result = None
self.error = e
[docs]
def was_successful(self) -> bool:
"""
Inspects the result and error values of the async task.
For a task to be "successful" the result must have a value and the
error must be None.
:return: True if task finished successfully
"""
return self.result is not None and self.error is None