FlatCAMWorker.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. if ('worker_name' in task and task['worker_name'] == self.name) or \
  37. ('worker_name' not in task and self.name is None):
  38. try:
  39. task['fcn'](*task['params'])
  40. except Exception as e:
  41. self.app.thread_exception.emit(e)
  42. raise e
  43. return
  44. # FlatCAMApp.App.log.debug("Task ignored.")
  45. self.app.log.debug("Task ignored.")