diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c212d4e..dc622ade 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ CHANGELOG for FlatCAM Evo beta ================================================= +01.03.2023 + +- in Tool Milling made sure that deleting the only tool will not crash the application +- added a new parameter in Preferences to control the number of processes created by the Pool() - more processes better performance but also a lot of memory consumed +- made sure that the display of messages in the Status Bar is done asap + 19.01.2023 - added a new method for bilinear interpolation diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index f6b9e37e..4f545226 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -71,6 +71,7 @@ class PreferencesUIManager(QtCore.QObject): "global_send_stats": self.ui.general_pref_form.general_app_group.send_stats_cb, "global_worker_number": self.ui.general_pref_form.general_app_group.worker_number_sb, + "global_process_number": self.ui.general_pref_form.general_app_group.process_number_sb, "global_tolerance": self.ui.general_pref_form.general_app_group.tol_entry, "global_compression_level": self.ui.general_pref_form.general_app_group.compress_spinner, diff --git a/appGUI/preferences/general/GeneralAppPrefGroupUI.py b/appGUI/preferences/general/GeneralAppPrefGroupUI.py index 16d67696..16453bf7 100644 --- a/appGUI/preferences/general/GeneralAppPrefGroupUI.py +++ b/appGUI/preferences/general/GeneralAppPrefGroupUI.py @@ -119,16 +119,29 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): _("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" + "unresponsive. Can have a value between 2 and 32.\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.set_range(2, 16) + self.worker_number_sb.set_range(2, 32) grid1.addWidget(self.worker_number_label, 2, 0) grid1.addWidget(self.worker_number_sb, 2, 1) + # Process Numbers + self.process_number_label = FCLabel('%s:' % _('Process number')) + self.process_number_label.setToolTip( + _("The number of processes.\n" + "A larger number may improve performance but it will require more memory.\n" + "After change, it will be applied at next App start.") + ) + self.process_number_sb = FCSpinner() + self.process_number_sb.set_range(2, 32) + + grid1.addWidget(self.process_number_label, 4, 0) + grid1.addWidget(self.process_number_sb, 4, 1) + # Geometric tolerance tol_label = FCLabel('%s:' % _("Geo Tolerance")) tol_label.setToolTip(_( @@ -143,8 +156,8 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): self.tol_entry.setSingleStep(0.001) self.tol_entry.set_precision(6) - grid1.addWidget(tol_label, 4, 0) - grid1.addWidget(self.tol_entry, 4, 1) + grid1.addWidget(tol_label, 6, 0) + grid1.addWidget(self.tol_entry, 6, 1) # Portability self.portability_cb = FCCheckBox('%s' % _('Portable app')) @@ -153,7 +166,7 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): "which means that the preferences files will be saved\n" "in the application folder, in the lib\\config subfolder.")) - grid1.addWidget(self.portability_cb, 6, 0, 1, 2) + grid1.addWidget(self.portability_cb, 8, 0, 1, 2) # Verbose Log self.verbose_label = FCLabel('%s:' % _('Verbose log')) @@ -166,8 +179,8 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): self.verbose_combo = FCComboBox2() self.verbose_combo.addItems(['0','1', '2']) - grid1.addWidget(self.verbose_label, 8, 0) - grid1.addWidget(self.verbose_combo, 8, 1) + grid1.addWidget(self.verbose_label, 10, 0) + grid1.addWidget(self.verbose_combo, 10, 1) # ############################################################################################################# # Grid0 Frame diff --git a/appMain.py b/appMain.py index 547ae5e2..93482057 100644 --- a/appMain.py +++ b/appMain.py @@ -634,7 +634,7 @@ class App(QtCore.QObject): # ########################################################################################################### # ###################################### CREATE MULTIPROCESSING POOL ####################################### # ########################################################################################################### - self.pool = Pool() + self.pool = Pool(processes=self.options["global_process_number"]) # ########################################################################################################### # ###################################### Clear GUI Settings - once at first start ########################### @@ -1564,7 +1564,7 @@ class App(QtCore.QObject): """ self.pool.close() - self.pool = Pool() + self.pool = Pool(processes=self.options["global_process_number"]) self.pool_recreated.emit(self.pool) gc.collect() @@ -2743,6 +2743,7 @@ class App(QtCore.QObject): # is not printed over and over on the shell if msg != '' and shell_echo is True: self.shell_message(msg) + QtWidgets.QApplication.processEvents() def info_shell(self, msg, new_line=True): """ diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index 11fc626b..fb4d6cee 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -402,7 +402,7 @@ class ToolMilling(AppTool, Excellon): _("Copy"), self.on_tool_copy, icon=QtGui.QIcon(self.app.resource_location + "/copy16.png")) self.ui.geo_tools_table.addContextMenu( - _("Delete"), lambda: self.on_tool_delete(clicked_signal=None, all_tools=None), + _("Delete"), lambda: self.on_tool_delete(all_tools=None), icon=QtGui.QIcon(self.app.resource_location + "/trash16.png")) # ############################################################################################################# diff --git a/appPool.py b/appPool.py index 464fcbac..6333159c 100644 --- a/appPool.py +++ b/appPool.py @@ -23,7 +23,7 @@ class WorkerPool(QtCore.QObject): def __init__(self): super(WorkerPool, self).__init__() - self.pool = Pool(cpu_count()) + self.pool = Pool(int(cpu_count() / 4)) def add_task(self, task): print("adding task", task) diff --git a/defaults.py b/defaults.py index 4c79a9d0..3cd24993 100644 --- a/defaults.py +++ b/defaults.py @@ -100,6 +100,7 @@ class AppDefaults: "global_version_check": True, "global_send_stats": True, "global_worker_number": int((os.cpu_count()) / 2) if os.cpu_count() > 4 else 1, + "global_process_number": int((os.cpu_count()) / 4) if os.cpu_count() > 4 else 1, "global_tolerance": 0.005, "global_save_compressed": True,