Closing the About dialog while a "Check for updates" request was in flight GC'd the dialog and the running QThread, aborting with QThread: Destroyed while thread is still running. Reproduced on unpatched main with an offscreen QApplication and a slowed fetch_latest_release; the same script passes with this fix (keepalive verified released after the thread finishes).
Fix: a class-level _live set holds every UpdateCheckWorker until its finished signal fires. Callers may drop their reference at any time; a result delivered to a destroyed receiver is silently discarded by Qt. Covers both the About dialog and the silent startup check with zero call-site changes.
Closes #32.
Closing the About dialog while a "Check for updates" request was in flight GC'd the dialog **and the running QThread**, aborting with `QThread: Destroyed while thread is still running`. Reproduced on unpatched main with an offscreen QApplication and a slowed `fetch_latest_release`; the same script passes with this fix (keepalive verified released after the thread finishes).
Fix: a class-level `_live` set holds every `UpdateCheckWorker` until its `finished` signal fires. Callers may drop their reference at any time; a result delivered to a destroyed receiver is silently discarded by Qt. Covers both the About dialog and the silent startup check with zero call-site changes.
Tests + ruff clean.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Closing the About dialog mid-check GC'd the dialog and the running
QThread with it -> 'QThread: Destroyed while thread is still running'.
A class-level keepalive set now holds each worker until finished;
stale results to a destroyed receiver are dropped by Qt.
Closes#32
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
the_og
merged commit 1087fc84d1 into main2026-07-12 13:00:22 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #32.
Closing the About dialog while a "Check for updates" request was in flight GC'd the dialog and the running QThread, aborting with
QThread: Destroyed while thread is still running. Reproduced on unpatched main with an offscreen QApplication and a slowedfetch_latest_release; the same script passes with this fix (keepalive verified released after the thread finishes).Fix: a class-level
_liveset holds everyUpdateCheckWorkeruntil itsfinishedsignal fires. Callers may drop their reference at any time; a result delivered to a destroyed receiver is silently discarded by Qt. Covers both the About dialog and the silent startup check with zero call-site changes.Tests + ruff clean.
🤖 Generated with Claude Code