MainCode/adalm1000_logger.py aktualisiert

Thread Safety Violations:

        Qt objects (like QWidgets) must only be accessed from the main thread (GUI thread)

        Your measurement thread is directly interacting with GUI elements

    Painter Conflicts:

        Multiple threads trying to paint to the same canvas simultaneously

        Recursive repaint calls

    Segmentation Fault:

        Likely caused by improper thread cleanup or accessing deleted objects
This commit is contained in:
Jan 2025-07-03 13:45:46 +02:00
parent f75d1dbcf7
commit df69d0e832

View File

@ -13,13 +13,13 @@ from collections import deque
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel,
QPushButton, QLineEdit, QCheckBox, QFrame, QMessageBox, QFileDialog)
from PyQt5.QtCore import Qt, QTimer, pyqtSignal, pyqtSlot, QObject
from PyQt5.QtCore import Qt, QTimer, pyqtSignal, pyqtSlot, QObject, QThread
import pysmu
class DeviceDisconnectedError(Exception):
pass
class MeasurementThread(QObject):
class MeasurementThread(QThread):
update_signal = pyqtSignal(float, float, float)
error_signal = pyqtSignal(str)
@ -67,6 +67,7 @@ class MeasurementThread(QObject):
class BatteryTester(QMainWindow):
def __init__(self):
self.plot_mutex = threading.Lock()
super().__init__()
# Color scheme
@ -418,8 +419,8 @@ class BatteryTester(QMainWindow):
self.measurement_thread.update_signal.connect(self.update_measurements)
self.measurement_thread.error_signal.connect(self.handle_device_error)
self.thread = threading.Thread(target=self.measurement_thread.run, daemon=True)
self.thread.start()
# Start the QThread directly (no need for threading.Thread)
self.measurement_thread.start()
except Exception as e:
self.handle_device_error(str(e))
@ -842,10 +843,11 @@ class BatteryTester(QMainWindow):
if not self.time_data:
return
self.line_voltage.set_data(self.time_data, self.voltage_data)
self.line_current.set_data(self.time_data, self.current_data)
self.auto_scale_axes()
self.canvas.draw_idle()
with self.plot_mutex:
self.line_voltage.set_data(self.time_data, self.voltage_data)
self.line_current.set_data(self.time_data, self.current_data)
self.auto_scale_axes()
self.canvas.draw_idle()
def auto_scale_axes(self):
"""Auto-scale plot axes with appropriate padding and strict boundaries"""
@ -968,6 +970,8 @@ class BatteryTester(QMainWindow):
if hasattr(self, 'measurement_thread'):
self.measurement_thread.stop()
self.measurement_thread.quit()
self.measurement_thread.wait(1000) # Wait up to 1 second
if hasattr(self, 'session') and self.session:
try: