Don't freeze the GUI thread on disconnect

ws_client.disconnect() blocks until the close handshake completes
(observed ~10s when the server doesn't ack promptly), and was being
called straight from the Connect/Disconnect button's click handler -
joining that wait on the GUI thread, so the click appeared to do
nothing until the timeout passed. Run it off a throwaway thread
instead; on_ws_connect_changed() already flips the button once the
disconnect actually finishes.
This commit is contained in:
2026-06-20 23:09:23 +02:00
parent d1a69f19ce
commit 127dd9da51
+7 -1
View File
@@ -3,6 +3,7 @@ from main_window import Ui_MainWindow
from PyQt5 import QtWidgets, QtGui, QtCore from PyQt5 import QtWidgets, QtGui, QtCore
import json import json
import sys import sys
import threading
import time import time
import matplotlib import matplotlib
matplotlib.use("Qt5Agg") matplotlib.use("Qt5Agg")
@@ -246,7 +247,12 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
self.plot_power_set, self.plot_power_eff) self.plot_power_set, self.plot_power_eff)
def disconnect(self): def disconnect(self):
self.ws_client.disconnect() # ws_client.disconnect() blocks until the websocket's close handshake
# completes (or times out, ~10s if the server doesn't ack promptly),
# joining the connection's background thread - run it off a throwaway
# thread so that wait doesn't freeze the GUI. on_ws_connect_changed()
# still flips the button once the disconnect actually finishes.
threading.Thread(target=self.ws_client.disconnect, daemon=True).start()
def on_btn_connect_clicked(self): def on_btn_connect_clicked(self):
if self.connected: if self.connected: