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):