Skip to content

Commit 535bddb

Browse files
Merge pull request #39 from geo-stack/rework_thread_management
PR: Rework taskmanager thread management
2 parents 75d3cfa + 311e2df commit 535bddb

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

qtapputils/managers/taskmanagers.py

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from time import sleep
1818

1919
# ---- Third party imports
20-
from qtpy.QtCore import QObject, QThread, Signal
20+
from qtpy.QtCore import QObject, QThread, Signal, Qt
2121

2222
# ---- Local imports
2323
from qtapputils.qthelpers import qtwait
@@ -67,7 +67,6 @@ def run_tasks(self):
6767
self.sig_task_completed.emit(task_uuid4, returned_values)
6868

6969
self._tasks.clear()
70-
self.thread().quit()
7170

7271

7372
class TaskManagerBase(QObject):
@@ -76,6 +75,7 @@ class TaskManagerBase(QObject):
7675
"""
7776
sig_run_tasks_started = Signal()
7877
sig_run_tasks_finished = Signal()
78+
sig_run_tasks = Signal()
7979

8080
def __init__(self, verbose: bool = False):
8181
super().__init__()
@@ -102,9 +102,7 @@ def __init__(self, verbose: bool = False):
102102

103103
@property
104104
def is_running(self):
105-
return not (len(self._running_tasks) == 0 and
106-
len(self._pending_tasks) == 0 and
107-
not self._thread.isRunning())
105+
return len(self._running_tasks + self._pending_tasks) > 0
108106

109107
def run_tasks(
110108
self, callback: Callable = None, returned_values: tuple = None):
@@ -134,13 +132,16 @@ def worker(self) -> WorkerBase:
134132

135133
def set_worker(self, worker: WorkerBase):
136134
""""Install the provided worker on this manager"""
137-
self._worker = worker
138135
self._thread = QThread()
136+
137+
self._worker = worker
139138
self._worker.moveToThread(self._thread)
140-
self._thread.started.connect(self._worker.run_tasks)
139+
self._worker.sig_task_completed.connect(
140+
self._handle_task_completed, Qt.QueuedConnection)
141+
self.sig_run_tasks.connect(
142+
self._worker.run_tasks, Qt.QueuedConnection)
141143

142-
# Connect the worker signals to handlers.
143-
self._worker.sig_task_completed.connect(self._handle_task_completed)
144+
self._thread.start()
144145

145146
# ---- Private API
146147
def _handle_task_completed(
@@ -202,22 +203,19 @@ def _run_pending_tasks(self):
202203
print('Executing {} pending tasks...'.format(
203204
len(self._pending_tasks)))
204205

205-
# Even though the worker has executed all its tasks,
206-
# we may still need to wait a little for it to stop properly.
207-
i = 0
208-
while self._thread.isRunning():
209-
sleep(0.1)
210-
i += 1
211-
if i > 100:
212-
print("Error: unable to stop {}'s working thread.".format(
213-
self.__class__.__name__))
214-
215206
self._running_tasks = self._pending_tasks.copy()
216207
self._pending_tasks = []
217208
for task_uuid4 in self._running_tasks:
218209
task, args, kargs = self._task_data[task_uuid4]
219210
self._worker.add_task(task_uuid4, task, *args, **kargs)
220-
self._thread.start()
211+
212+
self.sig_run_tasks.emit()
213+
214+
def close(self):
215+
if hasattr(self, "_thread"):
216+
qtwait(lambda: not self.is_running)
217+
self._thread.quit()
218+
self._thread.wait()
221219

222220

223221
class LIFOTaskManager(TaskManagerBase):

qtapputils/managers/tests/test_taskmanagers.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ def task_manager(worker, qtbot):
5252
task_manager.set_worker(worker)
5353
yield task_manager
5454

55-
# We wait for the manager's thread to fully stop to avoid segfault error.
56-
qtbot.waitUntil(lambda: not task_manager.is_running)
55+
task_manager.close()
56+
assert not task_manager.is_running
57+
assert not task_manager._thread.isRunning()
5758

5859

5960
@pytest.fixture
@@ -62,8 +63,9 @@ def lifo_task_manager(worker, qtbot):
6263
task_manager.set_worker(worker)
6364
yield task_manager
6465

65-
# We wait for the manager's thread to fully stop to avoid segfault error.
66-
qtbot.waitUntil(lambda: not task_manager.is_running)
66+
task_manager.close()
67+
assert not task_manager.is_running
68+
assert not task_manager._thread.isRunning()
6769

6870

6971
# =============================================================================

0 commit comments

Comments
 (0)