1717from 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
2323from 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
7372class 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
223221class LIFOTaskManager (TaskManagerBase ):
0 commit comments