| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- ############################################################
- # FlatCAM: 2D Post-processing for Manufacturing #
- # http://flatcam.org #
- # Author: Juan Pablo Caram (c) #
- # Date: 2/5/2014 #
- # MIT Licence #
- ############################################################
- from PyQt5 import QtCore
- class Worker(QtCore.QObject):
- """
- Implements a queue of tasks to be carried out in order
- in a single independent thread.
- """
- # avoid multiple tests for debug availability
- pydevd_failed = False
- task_completed = QtCore.pyqtSignal(str)
- def __init__(self, app, name=None):
- super(Worker, self).__init__()
- self.app = app
- self.name = name
- def allow_debug(self):
- """
- allow debuging/breakpoints in this threads
- should work from PyCharm and PyDev
- :return:
- """
- if not self.pydevd_failed:
- try:
- import pydevd
- pydevd.settrace(suspend=False, trace_only_current_thread=True)
- except ImportError:
- self.pydevd_failed=True
- def run(self):
- # self.app.log.debug("Worker Started!")
- self.allow_debug()
- # Tasks are queued in the event listener.
- self.app.worker_task.connect(self.do_worker_task)
- def do_worker_task(self, task):
- # self.app.log.debug("Running task: %s" % str(task))
- self.allow_debug()
- if ('worker_name' in task and task['worker_name'] == self.name) or \
- ('worker_name' not in task and self.name is None):
- try:
- task['fcn'](*task['params'])
- except Exception as e:
- self.app.thread_exception.emit(e)
- # raise e
- finally:
- self.task_completed.emit(self.name)
- # self.app.log.debug("Task ignored.")
|