Python GUI:終了時のクリーンアップ — PyQt6... ノート

Python GUI:終了時のクリーンアップ — PyQt6 アプリケーションを閉じる際にスレッドを停止する — アプリケーションウィンドウが閉じられたときにバックグラウンドスレッドとワーカーを適切にシャットダウンする方法

PyQt アプリケーションにおけるバックグラウンドスレッドは、QThreadPool または QThread によって管理され、メインウィンドウが閉じられた後も実行を続けます。これにより、アプリケーションがハングしたり、エラーが発生したりする可能性があります。これを解決するには、メインウィンドウクラスで closeEvent メソッドをオーバーライドします。このメソッドは、ウィンドウが閉じ始めるときに自動的に呼び出され、クリーンアップコードを実行する機会を提供します。closeEvent の内部では、すべてのバックグラウンドワーカーに実行を停止するようにシグナルを送る必要があります。QRunnable として実装されたワーカーの場合、これには通常、ワーカーの run メソッドが定期的にチェックする内部フラグを設定することが含まれます。ワーカーに停止をシグナルした後、QThreadPool.waitForDone() を使用して、プール内のすべてのスレッドがタスクを完了するまで実行を一時停止します。これにより、スレッドが突然終了することがなくなり、潜在的な問題を防ぐことができます。最後に、event.accept() を呼び出して、ウィンドウが正常に閉じられるようにします。また、アプリケーションのイベントループの実行を sys.exit() でラップして、プロセスのクリーンな終了を保証することも重要です。このパターンにより、アプリケーションが完全に終了する前に、すべてのバックグラウンド操作が正常に停止することが保証されます。