FlatCAMWorker.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. ############################################################
  2. # FlatCAM: 2D Post-processing for Manufacturing #
  3. # http://flatcam.org #
  4. # Author: Juan Pablo Caram (c) #
  5. # Date: 2/5/2014 #
  6. # MIT Licence #
  7. ############################################################
  8. from PyQt5 import QtCore
  9. class Worker(QtCore.QObject):
  10. """
  11. Implements a queue of tasks to be carried out in order
  12. in a single independent thread.
  13. """
  14. # avoid multiple tests for debug availability
  15. pydevd_failed = False
  16. task_completed = QtCore.pyqtSignal(str)
  17. def __init__(self, app, name=None):
  18. super(Worker, self).__init__()
  19. self.app = app
  20. self.name = name
  21. def allow_debug(self):
  22. """
  23. allow debuging/breakpoints in this threads
  24. should work from PyCharm and PyDev
  25. :return:
  26. """
  27. if not self.pydevd_failed:
  28. try:
  29. import pydevd
  30. pydevd.settrace(suspend=False, trace_only_current_thread=True)
  31. except ImportError:
  32. self.pydevd_failed=True
  33. def run(self):
  34. # self.app.log.debug("Worker Started!")
  35. self.allow_debug()
  36. # Tasks are queued in the event listener.
  37. self.app.worker_task.connect(self.do_worker_task)
  38. def do_worker_task(self, task):
  39. # self.app.log.debug("Running task: %s" % str(task))
  40. self.allow_debug()
  41. if ('worker_name' in task and task['worker_name'] == self.name) or \
  42. ('worker_name' not in task and self.name is None):
  43. try:
  44. task['fcn'](*task['params'])
  45. except Exception as e:
  46. self.app.thread_exception.emit(e)
  47. raise e
  48. finally:
  49. self.task_completed.emit(self.name)
  50. # self.app.log.debug("Task ignored.")