FlatCAMWorker.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from PyQt4 import QtCore
  2. class Worker(QtCore.QObject):
  3. """
  4. Implements a queue of tasks to be carried out in order
  5. in a single independent thread.
  6. """
  7. # avoid multiple tests for debug availability
  8. pydevd_failed = False
  9. def __init__(self, app, name=None):
  10. super(Worker, self).__init__()
  11. self.app = app
  12. self.name = name
  13. def allow_debug(self):
  14. """
  15. allow debuging/breakpoints in this threads
  16. should work from PyCharm and PyDev
  17. :return:
  18. """
  19. if not self.pydevd_failed:
  20. try:
  21. import pydevd
  22. pydevd.settrace(suspend=False, trace_only_current_thread=True)
  23. except ImportError:
  24. self.pydevd_failed=True
  25. def run(self):
  26. # allow debuging/breakpoints in this threads
  27. #pydevd.settrace(suspend=False, trace_only_current_thread=True)
  28. # FlatCAMApp.App.log.debug("Worker Started!")
  29. self.app.log.debug("Worker Started!")
  30. # Tasks are queued in the event listener.
  31. self.app.worker_task.connect(self.do_worker_task)
  32. def do_worker_task(self, task):
  33. # FlatCAMApp.App.log.debug("Running task: %s" % str(task))
  34. self.app.log.debug("Running task: %s" % str(task))
  35. self.allow_debug()
  36. # 'worker_name' property of task allows to target
  37. # specific worker.
  38. if 'worker_name' in task and task['worker_name'] == self.name:
  39. task['fcn'](*task['params'])
  40. return
  41. if 'worker_name' not in task and self.name is None:
  42. task['fcn'](*task['params'])
  43. return
  44. # FlatCAMApp.App.log.debug("Task ignored.")
  45. self.app.log.debug("Task ignored.")