Улучшена скорость полла Watch (переделано формирование таблицы)
This commit is contained in:
parent
6830743477
commit
f89aff1b1c
@ -459,7 +459,7 @@ class LowLevelSelectorWidget(QtWidgets.QWidget):
|
|||||||
|
|
||||||
lay.addLayout(form)
|
lay.addLayout(form)
|
||||||
|
|
||||||
self.btn_prepare = QtWidgets.QPushButton('Prepare Variable Dict')
|
self.btn_prepare = QtWidgets.QPushButton('Prepare Variable')
|
||||||
lay.addWidget(self.btn_prepare)
|
lay.addWidget(self.btn_prepare)
|
||||||
lay.addStretch(1)
|
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}")
|
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):
|
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
|
is_signed = (iq_raw & SIGN_BIT_MASK) != 0
|
||||||
frac_bits = iq_raw & FRAC_MASK_FULL
|
frac_bits = iq_raw & FRAC_MASK_FULL
|
||||||
iq_disp = f"{frac_bits}{'s' if is_signed else 'u'}"
|
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}"
|
_set_text(row, 0, idx_strs[row])
|
||||||
items = [
|
_set_text(row, 1, names[row])
|
||||||
QtWidgets.QTableWidgetItem(str(idx)),
|
_set_text(row, 2, iq_disp)
|
||||||
QtWidgets.QTableWidgetItem(nm),
|
_set_text(row, 3, raw_strs[row])
|
||||||
QtWidgets.QTableWidgetItem(iq_disp),
|
_set_text(row, 4, scaled_strs[row])
|
||||||
QtWidgets.QTableWidgetItem(raw_display),
|
|
||||||
QtWidgets.QTableWidgetItem(scaled_display),
|
# Разморозка
|
||||||
]
|
tbl.blockSignals(False)
|
||||||
for it in items:
|
tbl.setUpdatesEnabled(True)
|
||||||
it.setFlags(it.flags() & ~QtCore.Qt.ItemIsEditable)
|
tbl.setSortingEnabled(prev_sorting)
|
||||||
for c, it in enumerate(items):
|
tbl.viewport().update()
|
||||||
self.tbl_values.setItem(row, c, it)
|
|
||||||
|
|
||||||
# ------------------------------ POLLING --------------------------------
|
# ------------------------------ POLLING --------------------------------
|
||||||
def _toggle_polling(self):
|
def _toggle_polling(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user