diff --git a/FlatCAMApp.py b/FlatCAMApp.py index e46f14b0..8c5e2780 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -319,6 +319,7 @@ class App(QtCore.QObject): "global_project_at_startup": self.ui.general_defaults_form.general_app_group.project_startup_cb, "global_project_autohide": self.ui.general_defaults_form.general_app_group.project_autohide_cb, "global_toggle_tooltips": self.ui.general_defaults_form.general_app_group.toggle_tooltips_cb, + "global_worker_number": self.ui.general_defaults_form.general_app_group.worker_number_sb, "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_combo, "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb, @@ -586,6 +587,7 @@ class App(QtCore.QObject): "global_project_at_startup": False, "global_project_autohide": True, "global_toggle_tooltips": True, + "global_worker_number": 2, "global_compression_level": 3, "global_save_compressed": True, @@ -1221,7 +1223,10 @@ class App(QtCore.QObject): self.log.debug("Finished adding Geometry and Excellon Editor's.") #### Worker #### - self.workers = WorkerStack() + if self.defaults["global_worker_number"]: + self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"])) + else: + self.workers = WorkerStack(workers_number=2) self.worker_task.connect(self.workers.add_task) diff --git a/FlatCAMWorkerStack.py b/FlatCAMWorkerStack.py index 4ec87956..d7514ef7 100644 --- a/FlatCAMWorkerStack.py +++ b/FlatCAMWorkerStack.py @@ -8,7 +8,7 @@ class WorkerStack(QtCore.QObject): worker_task = QtCore.pyqtSignal(dict) # 'worker_name', 'func', 'params' thread_exception = QtCore.pyqtSignal(object) - def __init__(self): + def __init__(self, workers_number): super(WorkerStack, self).__init__() self.workers = [] @@ -16,7 +16,7 @@ class WorkerStack(QtCore.QObject): self.load = {} # {'worker_name': tasks_count} # Create workers crew - for i in range(0, 2): + for i in range(0, workers_number): worker = Worker(self, 'Slogger-' + str(i)) thread = QtCore.QThread() diff --git a/README.md b/README.md index 5b7d2ddb..c381dd40 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ CAD program, and create G-Code for Isolation routing. - Gerber Editor: made geometry transfer (which is slow) to Editor to be multithreaded - Gerber Editor: plotting process is showed in the status bar +- increased the number of workers in FlatCAM and made the number of workers customizable from Preferences 4.04.2019 diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 347afe3e..a43636d6 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -3519,6 +3519,25 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): _( "Check this box if you want to have toolTips displayed\n" "when hovering with mouse over items throughout the App.") ) + self.worker_number_label = QtWidgets.QLabel(_('Workers number:')) + self.worker_number_label.setToolTip( + _("The number of Qthreads made available to the App.\n" + "A bigger number may finish the jobs more quickly but\n" + "depending on your computer speed, may make the App\n" + "unresponsive. Can have a value between 2 and 16.\n" + "Default value is 2.\n" + "After change, it will be applied at next App start.") + ) + self.worker_number_sb = FCSpinner() + self.worker_number_sb.setToolTip( + _("The number of Qthreads made available to the App.\n" + "A bigger number may finish the jobs more quickly but\n" + "depending on your computer speed, may make the App\n" + "unresponsive. Can have a value between 2 and 16.\n" + "Default value is 2.\n" + "After change, it will be applied at next App start.") + ) + self.worker_number_sb.set_range(2, 16) # Just to add empty rows self.spacelabel = QtWidgets.QLabel('') @@ -3539,6 +3558,8 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): self.form_box.addRow(self.project_startup_label, self.project_startup_cb) self.form_box.addRow(self.project_autohide_label, self.project_autohide_cb) self.form_box.addRow(self.toggle_tooltips_label, self.toggle_tooltips_cb) + self.form_box.addRow(self.worker_number_label, self.worker_number_sb) + self.form_box.addRow(self.spacelabel, self.spacelabel) # Add the QFormLayout that holds the Application general defaults diff --git a/flatcamGUI/GUIElements.py b/flatcamGUI/GUIElements.py index 0ea93902..8c5542e4 100644 --- a/flatcamGUI/GUIElements.py +++ b/flatcamGUI/GUIElements.py @@ -1382,6 +1382,18 @@ class SpinBoxDelegate(QtWidgets.QItemDelegate): class FCSpinner(QtWidgets.QSpinBox): def __init__(self, parent=None): super(FCSpinner, self).__init__(parent) + self.readyToEdit = True + + def mousePressEvent(self, e, parent=None): + super(FCSpinner, self).mousePressEvent(e) # required to deselect on 2e click + if self.readyToEdit: + self.lineEdit().selectAll() + self.readyToEdit = False + + def focusOutEvent(self, e): + super(FCSpinner, self).focusOutEvent(e) # required to remove cursor on focusOut + self.lineEdit().deselect() + self.readyToEdit = True def get_value(self): return str(self.value()) @@ -1394,6 +1406,9 @@ class FCSpinner(QtWidgets.QSpinBox): return self.setValue(k) + def set_range(self, min_val, max_val): + self.setRange(min_val, max_val) + # def sizeHint(self): # default_hint_size = super(FCSpinner, self).sizeHint() # return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) @@ -1430,7 +1445,7 @@ class FCDoubleSpinner(QtWidgets.QDoubleSpinBox): self.setDecimals(val) def set_range(self, min_val, max_val): - self.setRange(self, min_val, max_val) + self.setRange(min_val, max_val) class Dialog_box(QtWidgets.QWidget):