FlatCAMWorker.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. import traceback
  10. class Worker(QtCore.QObject):
  11. """
  12. Implements a queue of tasks to be carried out in order
  13. in a single independent thread.
  14. """
  15. # avoid multiple tests for debug availability
  16. pydevd_failed = False
  17. task_completed = QtCore.pyqtSignal(str)
  18. def __init__(self, app, name=None):
  19. super(Worker, self).__init__()
  20. self.app = app
  21. self.name = name
  22. def allow_debug(self):
  23. """
  24. allow debuging/breakpoints in this threads
  25. should work from PyCharm and PyDev
  26. :return:
  27. """
  28. if not self.pydevd_failed:
  29. try:
  30. import pydevd
  31. pydevd.settrace(suspend=False, trace_only_current_thread=True)
  32. except ImportError:
  33. self.pydevd_failed = True
  34. def run(self):
  35. # self.app.log.debug("Worker Started!")
  36. self.allow_debug()
  37. # Tasks are queued in the event listener.
  38. self.app.worker_task.connect(self.do_worker_task)
  39. def do_worker_task(self, task):
  40. # self.app.log.debug("Running task: %s" % str(task))
  41. self.allow_debug()
  42. if ('worker_name' in task and task['worker_name'] == self.name) or \
  43. ('worker_name' not in task and self.name is None):
  44. try:
  45. task['fcn'](*task['params'])
  46. except Exception as e:
  47. self.app.thread_exception.emit(e)
  48. print(traceback.format_exc())
  49. # raise e
  50. finally:
  51. self.task_completed.emit(self.name)
  52. # self.app.log.debug("Task ignored.")