FlatCAMWorker.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 PyQt4 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. def __init__(self, app, name=None):
  17. super(Worker, self).__init__()
  18. self.app = app
  19. self.name = name
  20. def allow_debug(self):
  21. """
  22. allow debuging/breakpoints in this threads
  23. should work from PyCharm and PyDev
  24. :return:
  25. """
  26. if not self.pydevd_failed:
  27. try:
  28. import pydevd
  29. pydevd.settrace(suspend=False, trace_only_current_thread=True)
  30. except ImportError:
  31. self.pydevd_failed=True
  32. def run(self):
  33. self.app.log.debug("Worker Started!")
  34. self.allow_debug()
  35. # Tasks are queued in the event listener.
  36. self.app.worker_task.connect(self.do_worker_task)
  37. def do_worker_task(self, task):
  38. self.app.log.debug("Running task: %s" % str(task))
  39. self.allow_debug()
  40. if ('worker_name' in task and task['worker_name'] == self.name) or \
  41. ('worker_name' not in task and self.name is None):
  42. try:
  43. task['fcn'](*task['params'])
  44. except Exception as e:
  45. self.app.thread_exception.emit(e)
  46. raise e
  47. return
  48. self.app.log.debug("Task ignored.")