Fix: Worker-Pool-Metriken cachen für Anzeige nach Shutdown
Problem: - Worker-Pools werden nach Transformation beendet (Lazy Loading) - Metriken waren danach nicht mehr verfügbar - Metriken-Dialog zeigte "Nicht aktiviert" Lösung: - Metriken werden vor Pool-Shutdown mit deepcopy() gespeichert - MainWindow speichert last_saxon_metrics und last_fop_metrics - WorkerPoolMetricsDialog zeigt gecachte Metriken an - Neue Methode: _update_metrics_tab_from_metrics() Verhalten: - Metriken bleiben bis zur nächsten Transformation verfügbar - Dialog zeigt "Letzte Transformation" statt "Aktiviert" - Ohne Metriken: Hinweis "bitte erst eine Transformation durchführen" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -546,6 +546,10 @@ class MainWindow(QMainWindow):
|
|||||||
# Progressbar für Transformationen in Statusbar
|
# Progressbar für Transformationen in Statusbar
|
||||||
self.transformation_progress_bar = None
|
self.transformation_progress_bar = None
|
||||||
|
|
||||||
|
# Gespeicherte Worker-Pool-Metriken (werden vor Shutdown gecacht)
|
||||||
|
self.last_saxon_metrics = None
|
||||||
|
self.last_fop_metrics = None
|
||||||
|
|
||||||
# Mapping: xml_file_path_str → QTreeWidgetItem (für Progress Bar und Icon Updates)
|
# Mapping: xml_file_path_str → QTreeWidgetItem (für Progress Bar und Icon Updates)
|
||||||
self.xml_item_map = {}
|
self.xml_item_map = {}
|
||||||
|
|
||||||
@@ -4371,11 +4375,19 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
# Erfasse RAM-Verbrauch nach Transformation
|
# Erfasse RAM-Verbrauch nach Transformation
|
||||||
import transform
|
import transform
|
||||||
|
from copy import deepcopy
|
||||||
|
|
||||||
if transform._saxon_worker_pool:
|
if transform._saxon_worker_pool:
|
||||||
transform._saxon_worker_pool.capture_ram_after_transform()
|
transform._saxon_worker_pool.capture_ram_after_transform()
|
||||||
|
# Speichere Metriken vor Shutdown (für späteren Zugriff im Dialog)
|
||||||
|
self.last_saxon_metrics = deepcopy(transform._saxon_worker_pool.metrics)
|
||||||
|
logger.debug("Saxon Worker-Pool Metriken gespeichert")
|
||||||
|
|
||||||
if transform._fop_worker_pool:
|
if transform._fop_worker_pool:
|
||||||
transform._fop_worker_pool.capture_ram_after_transform()
|
transform._fop_worker_pool.capture_ram_after_transform()
|
||||||
|
# Speichere Metriken vor Shutdown (für späteren Zugriff im Dialog)
|
||||||
|
self.last_fop_metrics = deepcopy(transform._fop_worker_pool.metrics)
|
||||||
|
logger.debug("FOP Worker-Pool Metriken gespeichert")
|
||||||
|
|
||||||
# Beende Worker-Pools (RAM-Optimierung - Pools werden bei nächster Transformation neu gestartet)
|
# Beende Worker-Pools (RAM-Optimierung - Pools werden bei nächster Transformation neu gestartet)
|
||||||
self._shutdown_saxon_worker_pool()
|
self._shutdown_saxon_worker_pool()
|
||||||
|
|||||||
@@ -141,19 +141,26 @@ class WorkerPoolMetricsDialog(QDialog):
|
|||||||
|
|
||||||
def _load_metrics(self):
|
def _load_metrics(self):
|
||||||
"""Lädt und zeigt die Metriken an."""
|
"""Lädt und zeigt die Metriken an."""
|
||||||
import transform
|
# Hole MainWindow-Instanz (parent)
|
||||||
|
main_window = self.parent()
|
||||||
|
|
||||||
# Saxon Worker Pool
|
# Saxon Worker Pool - verwende gespeicherte Metriken
|
||||||
if transform._saxon_worker_pool:
|
if hasattr(main_window, "last_saxon_metrics") and main_window.last_saxon_metrics:
|
||||||
self._update_metrics_tab(self.saxon_tab, transform._saxon_worker_pool, "Saxon Worker Pool")
|
self._update_metrics_tab_from_metrics(
|
||||||
|
self.saxon_tab, main_window.last_saxon_metrics, "Saxon Worker Pool"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self._set_tab_status(self.saxon_tab, "<i>Nicht aktiviert</i>")
|
self._set_tab_status(
|
||||||
|
self.saxon_tab, "<i>Keine Metriken verfügbar - bitte erst eine Transformation durchführen</i>"
|
||||||
|
)
|
||||||
|
|
||||||
# FOP Worker Pool
|
# FOP Worker Pool - verwende gespeicherte Metriken
|
||||||
if transform._fop_worker_pool:
|
if hasattr(main_window, "last_fop_metrics") and main_window.last_fop_metrics:
|
||||||
self._update_metrics_tab(self.fop_tab, transform._fop_worker_pool, "FOP Worker Pool")
|
self._update_metrics_tab_from_metrics(self.fop_tab, main_window.last_fop_metrics, "FOP Worker Pool")
|
||||||
else:
|
else:
|
||||||
self._set_tab_status(self.fop_tab, "<i>Nicht aktiviert</i>")
|
self._set_tab_status(
|
||||||
|
self.fop_tab, "<i>Keine Metriken verfügbar - bitte erst eine Transformation durchführen</i>"
|
||||||
|
)
|
||||||
|
|
||||||
def _set_tab_status(self, tab: QWidget, status: str):
|
def _set_tab_status(self, tab: QWidget, status: str):
|
||||||
"""
|
"""
|
||||||
@@ -167,19 +174,18 @@ class WorkerPoolMetricsDialog(QDialog):
|
|||||||
if status_label:
|
if status_label:
|
||||||
status_label.setText(f"Status: {status}")
|
status_label.setText(f"Status: {status}")
|
||||||
|
|
||||||
def _update_metrics_tab(self, tab: QWidget, pool, pool_name: str):
|
def _update_metrics_tab_from_metrics(self, tab: QWidget, metrics, pool_name: str):
|
||||||
"""
|
"""
|
||||||
Aktualisiert die Metriken in einem Tab.
|
Aktualisiert die Metriken in einem Tab (direkt aus Metriken-Objekt).
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
tab: Das Tab-Widget
|
tab: Das Tab-Widget
|
||||||
pool: Der Worker-Pool (Saxon oder FOP)
|
metrics: Das WorkerPoolMetrics-Objekt
|
||||||
pool_name: Name des Pools
|
pool_name: Name des Pools
|
||||||
"""
|
"""
|
||||||
metrics = pool.metrics
|
# Status - berechne Worker-Anzahl aus Metriken
|
||||||
|
num_workers = len(metrics.worker_start_times) if metrics.worker_start_times else 0
|
||||||
# Status
|
self._set_tab_status(tab, f"<b>Letzte Transformation</b> ({num_workers} Worker)")
|
||||||
self._set_tab_status(tab, f"<b>Aktiviert</b> ({pool.num_workers} Worker)")
|
|
||||||
|
|
||||||
# Kompilierung
|
# Kompilierung
|
||||||
compile_time_label = tab.findChild(QLabel, "compile_time_label")
|
compile_time_label = tab.findChild(QLabel, "compile_time_label")
|
||||||
|
|||||||
Reference in New Issue
Block a user