From 29cb993b7b20bb224ca0f391595a467a9e97285c Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 21 Mar 2026 22:55:31 +0100 Subject: [PATCH] Fix cross-thread : QTimer.singleShot au lieu de pyqtSignal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pyqtSignal.emit() depuis un thread Python standard ne fonctionne pas. Utilise QTimer.singleShot(0, callback) qui est thread-safe et exécute le callback dans le thread principal Qt. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main.py | 5 +---- src/services/upload_server.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main.py b/src/main.py index 691bc18..ba07225 100644 --- a/src/main.py +++ b/src/main.py @@ -23,10 +23,7 @@ def main(): port = config.get("server_port", 8080) host = config.get("server_ip", "0.0.0.0") upload_server = UploadServer(host=host, port=port) - upload_server.signals.photos_received.connect( - window.home_screen.notify_qr_photos, - Qt.ConnectionType.QueuedConnection - ) + upload_server.set_callback(window.home_screen.notify_qr_photos) upload_server.start() # IMAP polling (Email) diff --git a/src/services/upload_server.py b/src/services/upload_server.py index 82876e3..5152a92 100644 --- a/src/services/upload_server.py +++ b/src/services/upload_server.py @@ -279,6 +279,7 @@ class UploadServer: self.host = host self.port = port self.signals = UploadSignals() + self._callback = None self.app = Flask(__name__) self._setup_routes() self._thread = None @@ -308,10 +309,18 @@ class UploadServer: saved.append(path) if saved: - self.signals.photos_received.emit(saved) + # QTimer.singleShot est thread-safe et exécute dans le thread principal + from PyQt6.QtCore import QTimer + from functools import partial + if self._callback: + QTimer.singleShot(0, partial(self._callback, saved)) return jsonify({"ok": True, "count": len(saved)}) + def set_callback(self, callback): + """Définit le callback appelé quand des photos sont uploadées.""" + self._callback = callback + def start(self): """Démarre le serveur dans un thread daemon.""" self._thread = threading.Thread(