Fix cross-thread : QTimer.singleShot au lieu de pyqtSignal

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) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 22:55:31 +01:00
parent 2c928ae84d
commit 29cb993b7b
2 changed files with 11 additions and 5 deletions

View File

@@ -23,10 +23,7 @@ def main():
port = config.get("server_port", 8080) port = config.get("server_port", 8080)
host = config.get("server_ip", "0.0.0.0") host = config.get("server_ip", "0.0.0.0")
upload_server = UploadServer(host=host, port=port) upload_server = UploadServer(host=host, port=port)
upload_server.signals.photos_received.connect( upload_server.set_callback(window.home_screen.notify_qr_photos)
window.home_screen.notify_qr_photos,
Qt.ConnectionType.QueuedConnection
)
upload_server.start() upload_server.start()
# IMAP polling (Email) # IMAP polling (Email)

View File

@@ -279,6 +279,7 @@ class UploadServer:
self.host = host self.host = host
self.port = port self.port = port
self.signals = UploadSignals() self.signals = UploadSignals()
self._callback = None
self.app = Flask(__name__) self.app = Flask(__name__)
self._setup_routes() self._setup_routes()
self._thread = None self._thread = None
@@ -308,10 +309,18 @@ class UploadServer:
saved.append(path) saved.append(path)
if saved: 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)}) 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): def start(self):
"""Démarre le serveur dans un thread daemon.""" """Démarre le serveur dans un thread daemon."""
self._thread = threading.Thread( self._thread = threading.Thread(