Harden worker cleanup + reduce cover-loading churn
- Library/metadata workers: delete the worker on its own thread via worker.finished -> worker.deleteLater (bound) instead of letting Python GC delete it on the GUI thread after untracking. - Cover templates: compute the transparent-window scan outside the lock so a slow first scan never holds the lock and stalls other cover threads. - Store: larger cover/date batches (500/400/300) so the store loads 3449 archives with far fewer QThread + ThreadPoolExecutor creations.
This commit is contained in:
+24
-22
@@ -797,28 +797,30 @@ def _transparent_rect(img):
|
||||
def _game_template():
|
||||
"""Load the PSP game cover template; return ``(template, window)``."""
|
||||
global _game_template_cache
|
||||
if _game_template_cache is None:
|
||||
with _game_template_lock:
|
||||
if _game_template_cache is None:
|
||||
try:
|
||||
from PySide6.QtGui import QImage
|
||||
except Exception: # noqa: BLE001 - headless API may lack PySide6
|
||||
_game_template_cache = (None, (0, 0, 0, 0))
|
||||
return _game_template_cache
|
||||
img = QImage()
|
||||
for path in (
|
||||
config.COVERS_DIR / "UMD_GAME_COVER_TEMPLATE.png",
|
||||
config.DATA_DIR / "covers" / "UMD_GAME_COVER_TEMPLATE.png",
|
||||
):
|
||||
if path.exists():
|
||||
img.load(str(path))
|
||||
if not img.isNull():
|
||||
break
|
||||
img = img.convertToFormat(QImage.Format_ARGB32) if not img.isNull() else None
|
||||
_game_template_cache = (
|
||||
img,
|
||||
_transparent_rect(img) if img is not None and not img.isNull() else (0, 0, 0, 0),
|
||||
)
|
||||
if _game_template_cache is not None:
|
||||
return _game_template_cache
|
||||
try:
|
||||
from PySide6.QtGui import QImage
|
||||
except Exception: # noqa: BLE001 - headless API may lack PySide6
|
||||
_game_template_cache = (None, (0, 0, 0, 0))
|
||||
return _game_template_cache
|
||||
img = QImage()
|
||||
for path in (
|
||||
config.COVERS_DIR / "UMD_GAME_COVER_TEMPLATE.png",
|
||||
config.DATA_DIR / "covers" / "UMD_GAME_COVER_TEMPLATE.png",
|
||||
):
|
||||
if path.exists():
|
||||
img.load(str(path))
|
||||
if not img.isNull():
|
||||
break
|
||||
img = img.convertToFormat(QImage.Format_ARGB32) if not img.isNull() else None
|
||||
entry = (
|
||||
img,
|
||||
_transparent_rect(img) if img is not None and not img.isNull() else (0, 0, 0, 0),
|
||||
)
|
||||
with _game_template_lock:
|
||||
if _game_template_cache is None:
|
||||
_game_template_cache = entry
|
||||
return _game_template_cache
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user