FlatCAMWorker.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. self.app.log.debug("Worker Started!")
  27. self.allow_debug()
  28. # Tasks are queued in the event listener.
  29. self.app.worker_task.connect(self.do_worker_task)
  30. def do_worker_task(self, task):
  31. self.app.log.debug("Running task: %s" % str(task))
  32. self.allow_debug()
  33. if ('worker_name' in task and task['worker_name'] == self.name) or \
  34. ('worker_name' not in task and self.name is None):
  35. try:
  36. task['fcn'](*task['params'])
  37. except Exception as e:
  38. self.app.thread_exception.emit(e)
  39. raise e
  40. return
  41. self.app.log.debug("Task ignored.")