Update-Fix: Installer beendet sich nicht mehr selbst, Neustart in die neue Version
Ursache: Der Installer beendete laufende Playtube-Prozesse per "taskkill /F /T". Der Updater startet ihn aus Playtube.exe heraus, er ist also ein Kindprozess - solange Playtube noch beendet wurde, schoss "/T" den Installer selbst mit ab, bevor er etwas installiert hatte (kein Kopieren, kein Neustart, nur der Download blieb im Temp-Ordner). - playtube.iss: taskkill ohne /T; Setup wartet per /WAITPID=<PID> (max. 20 s) darauf, dass sich die alte App selbst beendet; uebrig gebliebene QtWebEngine-Prozesse aus dem Installationsordner werden gezielt nach Pfad beendet - updater: uebergibt /WAITPID und /LOG (Setup-Protokoll nach %TEMP%); robocopy im ZIP-Fallback mit /R:3 /W:2, damit gesperrte Dateien das Update nicht endlos haengen - mainwindow: hartes Beenden nach 8 s, falls Qt/QtWebEngine beim Beenden haengt (sonst wartet der Update-Helfer ewig und die alte Version bleibt laufen)
This commit is contained in:
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
@@ -28,6 +29,15 @@ from .updater import UpdateChecker, UpdateInstaller
|
||||
ASSETS_DIR = Path(__file__).resolve().parent.parent / "assets"
|
||||
|
||||
|
||||
def _force_exit_after(seconds: float) -> None:
|
||||
"""Beendet den Prozess nach `seconds` hart (os._exit), falls das normale Beenden bis
|
||||
dahin noch nicht durch ist. Der Timer laeuft als Daemon-Thread und stoert das
|
||||
normale, schnelle Beenden nicht."""
|
||||
timer = threading.Timer(seconds, os._exit, args=(0,))
|
||||
timer.daemon = True
|
||||
timer.start()
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
def __init__(self, config: dict[str, Any]):
|
||||
super().__init__()
|
||||
@@ -359,6 +369,10 @@ class MainWindow(QMainWindow):
|
||||
"Installation abgeschlossen. Playtube wird neu gestartet …"
|
||||
)
|
||||
self._tray.setToolTip(f"{APP_NAME} – wird neu gestartet …")
|
||||
# Haengt sich Qt/QtWebEngine beim Beenden auf, wuerde der Update-Helfer (bzw.
|
||||
# Setup, siehe /WAITPID) ewig auf das Ende dieses Prozesses warten - und die
|
||||
# alte Version bliebe einfach weiterlaufen. Nach 8 s hart beenden.
|
||||
_force_exit_after(8.0)
|
||||
self._quit()
|
||||
else:
|
||||
QMessageBox.information(
|
||||
|
||||
Reference in New Issue
Block a user