Улучшена скорость полла Watch (переделано формирование таблицы)
This commit is contained in:
parent
6830743477
commit
f89aff1b1c
@ -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)
|
||||
|
||||
|
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user