From f89aff1b1c9d85cb675c6477718f173f04e59653 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Sat, 19 Jul 2025 18:17:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BB=D0=B0=20Watch=20(=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE=20=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/tms_debugvar_lowlevel.py | 2 +- Src/tms_debugvar_term.py | 77 ++++++++++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/Src/tms_debugvar_lowlevel.py b/Src/tms_debugvar_lowlevel.py index 471d10d..cd99366 100644 --- a/Src/tms_debugvar_lowlevel.py +++ b/Src/tms_debugvar_lowlevel.py @@ -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) diff --git a/Src/tms_debugvar_term.py b/Src/tms_debugvar_term.py index 9d28dd5..0cbf70f 100644 --- a/Src/tms_debugvar_term.py +++ b/Src/tms_debugvar_term.py @@ -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):