From 668bb1fdf650b75e7efd4e04fd27741a93ebcb8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Fri, 29 Nov 2013 03:26:51 +0100 Subject: [PATCH] backups: deal with multithread restore process Only GUI thread can interact with GUI widgets, so queue the requests and process from GUI thread. This applies to backup progress reports. --- qubesmanager/restore.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/qubesmanager/restore.py b/qubesmanager/restore.py index b185512..9826864 100644 --- a/qubesmanager/restore.py +++ b/qubesmanager/restore.py @@ -47,8 +47,8 @@ from ui_restoredlg import * from multiselectwidget import * from backup_utils import * - - +from multiprocessing import Queue +from multiprocessing.queues import Empty class RestoreVMsWindow(Ui_Restore, QWizard): @@ -66,6 +66,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard): self.restore_options = None self.backup_vms_list = None self.func_output = [] + self.feedback_queue = Queue() self.excluded = {} @@ -166,13 +167,14 @@ class RestoreVMsWindow(Ui_Restore, QWizard): self.func_output.append(s) def restore_error_output(self, s): - self.emit(SIGNAL("restore_progress(QString)"), '{0}'.format(s)) + self.feedback_queue.put((SIGNAL("restore_progress(QString)"), '{0}'.format(s))) def restore_output(self, s): - self.emit(SIGNAL("restore_progress(QString)"),'{0}'.format(s)) + self.feedback_queue.put((SIGNAL("restore_progress(QString)"),'{0}'.format(s))) def update_progress_bar(self, value): - self.emit(SIGNAL("backup_progress(int)"), value) + print "progress %d" % value + self.feedback_queue.put((SIGNAL("backup_progress(int)"), value)) def __do_restore__(self, thread_monitor): err_msg = [] @@ -237,12 +239,18 @@ class RestoreVMsWindow(Ui_Restore, QWizard): while not self.thread_monitor.is_finished(): self.app.processEvents() time.sleep (0.1) + try: + for (signal,data) in iter(self.feedback_queue.get_nowait,None): + self.emit(signal,data) + except Empty: + pass #if not self.thread_monitor.success: #QMessageBox.warning (None, "Backup error!", "ERROR: {1}".format(self.vm.name, self.thread_monitor.error_msg)) if self.dev_mount_path != None: umount_device(self.dev_mount_path) + self.progress_bar.setValue(100) self.button(self.FinishButton).setEnabled(True) def all_vms_good(self):