a138c539e4
- reimplemented the thread listening for new FlatCAM process starting with args so it is no longer subclassed but using the moveToThread function
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
from PyQt5 import QtCore
|
|
from FlatCAMWorker import Worker
|
|
import multiprocessing
|
|
|
|
|
|
class WorkerStack(QtCore.QObject):
|
|
|
|
worker_task = QtCore.pyqtSignal(dict) # 'worker_name', 'func', 'params'
|
|
thread_exception = QtCore.pyqtSignal(object)
|
|
|
|
def __init__(self, workers_number):
|
|
super(WorkerStack, self).__init__()
|
|
|
|
self.workers = []
|
|
self.threads = []
|
|
self.load = {} # {'worker_name': tasks_count}
|
|
|
|
# Create workers crew
|
|
for i in range(0, workers_number):
|
|
worker = Worker(self, 'Slogger-' + str(i))
|
|
thread = QtCore.QThread()
|
|
|
|
worker.moveToThread(thread)
|
|
# worker.connect(thread, QtCore.SIGNAL("started()"), worker.run)
|
|
thread.started.connect(worker.run)
|
|
worker.task_completed.connect(self.on_task_completed)
|
|
|
|
thread.start(QtCore.QThread.HighPriority)
|
|
|
|
self.workers.append(worker)
|
|
self.threads.append(thread)
|
|
self.load[worker.name] = 0
|
|
|
|
def __del__(self):
|
|
for thread in self.threads:
|
|
thread.terminate()
|
|
|
|
def add_task(self, task):
|
|
worker_name = min(self.load, key=self.load.get)
|
|
self.load[worker_name] += 1
|
|
self.worker_task.emit({'worker_name': worker_name, 'fcn': task['fcn'], 'params': task['params']})
|
|
|
|
def on_task_completed(self, worker_name):
|
|
self.load[str(worker_name)] -= 1
|