Улучшена скорость полла Watch (переделано формирование таблицы)

This commit is contained in:
Razvalyaev 2025-07-19 18:17:00 +03:00
parent 6830743477
commit f89aff1b1c
2 changed files with 62 additions and 17 deletions

View File

@ -459,7 +459,7 @@ class LowLevelSelectorWidget(QtWidgets.QWidget):
lay.addLayout(form)
self.btn_prepare = QtWidgets.QPushButton('Prepare Variable Dict')
self.btn_prepare = QtWidgets.QPushButton('Prepare Variable')
lay.addWidget(self.btn_prepare)
lay.addStretch(1)

View File

@ -765,25 +765,70 @@ class DebugTerminalWidget(QtWidgets.QWidget):
self._log(f"[LL] OK addr=0x{addr24:06X} type=0x{return_type:02X} raw={value_int} scaled={scaled:.6g}")
def _populate_table(self, idxs, names, iqs, raws, scaled):
# ... (код без изменений)
self.tbl_values.setRowCount(len(idxs))
for row, (idx, nm, iq_raw, rv, sv) in enumerate(zip(idxs, names, iqs, raws, scaled)):
"""
Быстрое массовое обновление таблицы значений.
- Не пересоздаём QTableWidgetItem при каждом вызове: обновляем текст.
- Блокируем сортировку, сигналы и обновления на время заполнения.
- Предвычисляем отображаемые строки (особенно формат scaled).
"""
tbl = self.tbl_values
n = len(idxs)
# Заморозка UI на время массового обновления
prev_sorting = tbl.isSortingEnabled()
tbl.setSortingEnabled(False)
tbl.blockSignals(True)
tbl.setUpdatesEnabled(False)
# Подготовка размера
if tbl.rowCount() != n:
tbl.setRowCount(n)
# Предварительно решаем: показывать сырые или масштабированные значения
show_raw = self.chk_raw.isChecked()
# Готовим строки (ускоряет при больших объёмах)
# str() заранее, чтобы не повторять в цикле
idx_strs = [str(v) for v in idxs]
raw_strs = [str(v) for v in raws]
scaled_strs = raw_strs if show_raw else [f"{v:.6g}" for v in scaled]
# Флаги необновляемых ячеек (только выбор/просмотр)
flags_ro = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
# Локальный шорткат для быстрой установки текста в ячейку
def _set_text(row, col, text):
item = tbl.item(row, col)
if item is None:
item = QtWidgets.QTableWidgetItem(text)
item.setFlags(flags_ro)
tbl.setItem(row, col, item)
else:
# обновим текст только при изменении (немного экономит на больших данных)
if item.text() != text:
item.setText(text)
if item.flags() != flags_ro:
item.setFlags(flags_ro)
# Основной цикл
for row in range(n):
iq_raw = iqs[row]
is_signed = (iq_raw & SIGN_BIT_MASK) != 0
frac_bits = iq_raw & FRAC_MASK_FULL
iq_disp = f"{frac_bits}{'s' if is_signed else 'u'}"
raw_display = str(rv)
scaled_display = raw_display if self.chk_raw.isChecked() else f"{sv:.6g}"
items = [
QtWidgets.QTableWidgetItem(str(idx)),
QtWidgets.QTableWidgetItem(nm),
QtWidgets.QTableWidgetItem(iq_disp),
QtWidgets.QTableWidgetItem(raw_display),
QtWidgets.QTableWidgetItem(scaled_display),
]
for it in items:
it.setFlags(it.flags() & ~QtCore.Qt.ItemIsEditable)
for c, it in enumerate(items):
self.tbl_values.setItem(row, c, it)
_set_text(row, 0, idx_strs[row])
_set_text(row, 1, names[row])
_set_text(row, 2, iq_disp)
_set_text(row, 3, raw_strs[row])
_set_text(row, 4, scaled_strs[row])
# Разморозка
tbl.blockSignals(False)
tbl.setUpdatesEnabled(True)
tbl.setSortingEnabled(prev_sorting)
tbl.viewport().update()
# ------------------------------ POLLING --------------------------------
def _toggle_polling(self):