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:
@@ -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)
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user