From e79d9db9f16b325d7433fc19dc8ea24dfc8a132c Mon Sep 17 00:00:00 2001 From: tassaron Date: Sat, 30 Apr 2022 21:45:16 -0400 Subject: fix 'QThread killed while running' at program exit --- src/gui/mainwindow.py | 30 +++++++++++++++--------------- src/gui/preview_thread.py | 12 ++++-------- 2 files changed, 19 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/gui/mainwindow.py b/src/gui/mainwindow.py index fcf4b4c..f6de763 100644 --- a/src/gui/mainwindow.py +++ b/src/gui/mainwindow.py @@ -10,7 +10,7 @@ from PIL import Image from queue import Queue import sys import os -import atexit +import signal import filecmp import time import logging @@ -74,9 +74,6 @@ class MainWindow(QtWidgets.QMainWindow): self.autosavePath = os.path.join(self.dataDir, 'autosave.avp') self.settings = Core.settings - # Register clean-up functions - atexit.register(self.cleanUp) - # Create stack of undoable user actions self.undoStack = QtWidgets.QUndoStack(self) undoLimit = self.settings.value("pref_undoLimit") @@ -94,15 +91,18 @@ class MainWindow(QtWidgets.QMainWindow): log.debug('Starting preview thread') self.previewQueue = Queue() self.previewThread = QtCore.QThread(self) - self.previewWorker = preview_thread.Worker(self, self.previewQueue) - self.previewWorker.error.connect(self.previewWindow.threadError) + self.previewWorker = preview_thread.Worker( + self.core, + self.settings, + self.previewQueue + ) self.previewWorker.moveToThread(self.previewThread) + self.newTask.connect(self.previewWorker.createPreviewImage) + self.processTask.connect(self.previewWorker.process) + self.previewWorker.error.connect(self.previewWindow.threadError) self.previewWorker.imageCreated.connect(self.showPreviewImage) self.previewThread.start() - self.previewThread.finished.connect( - lambda: - log.critical('PREVIEW THREAD DIED! This should never happen.') - ) + self.previewThread.finished.connect(lambda: log.info('Preview thread finished.')) timeout = 500 log.debug( @@ -429,6 +429,9 @@ class MainWindow(QtWidgets.QMainWindow): "Ctrl+Alt+Shift+A", self, lambda: log.debug(repr(self)) ) + # Close MainWindow when receiving Ctrl+C from terminal + signal.signal(signal.SIGINT, lambda *args: self.close()) + def __repr__(self): return ( '%s\n' @@ -441,15 +444,12 @@ class MainWindow(QtWidgets.QMainWindow): ) ) - def cleanUp(self, *args): + def closeEvent(self, event): log.info('Ending the preview thread') self.timer.stop() self.previewThread.quit() self.previewThread.wait() - - def terminate(self, *args): - self.cleanUp() - sys.exit(0) + return super().closeEvent(event) @disableWhenOpeningProject def updateWindowTitle(self): diff --git a/src/gui/preview_thread.py b/src/gui/preview_thread.py index 614b584..137864b 100644 --- a/src/gui/preview_thread.py +++ b/src/gui/preview_thread.py @@ -22,17 +22,13 @@ class Worker(QtCore.QObject): imageCreated = pyqtSignal(QtGui.QImage) error = pyqtSignal(str) - def __init__(self, parent=None, queue=None): + def __init__(self, core, settings, queue): super().__init__() - parent.newTask.connect(self.createPreviewImage) - parent.processTask.connect(self.process) - #self.parent = parent - self.core = parent.core - self.settings = parent.settings - self.queue = queue - + self.core = core + self.settings = settings width = int(self.settings.value('outputWidth')) height = int(self.settings.value('outputHeight')) + self.queue = queue self.background = Checkerboard(width, height) @disableWhenOpeningProject -- cgit v1.2.3