2013-10-05 51 views
6

Qtで書かれたWindowsにLinuxアプリケーションを移植しています。終了する前に、いくつかの設定を保存する必要があります。 Linuxでは、SIGTERMなどのシグナルハンドラでこれを行うことができます。どのようにしてWindows上で実装できますか?あなたはQtのイベントループを使用している場合QtでWindowsのシャットダウンまたはログオフを検出する方法

答えて

7

は、次の信号をキャッチすることができます:

無効QCoreApplication :: aboutToQuit()[信号]

アプリケーションがしようとしているときに、この信号が発せられますメインイベントループを終了する。イベントループレベルがゼロに低下したとき。これは、アプリケーション内部からのquit()呼び出し後、またはユーザーがデスクトップセッション全体をシャットダウンするときに発生する可能性があります。 アプリケーションは、最後の2回目のクリーンアップを実行する必要がある場合に特に便利です。この状態ではユーザーとの対話はできません。それ以外

、あなたは上記の信号はあなたのユースケースに適していない場合は、以下の次のメッセージを探していることがあります。

WM_QUIT:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx

WM_CLOSE:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx

WM_QUERYENDSESSION :http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx

WM_ENDSESSION:http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx

0

Qtがわかりません。あなたがWindowsになることができればWM_QUERYENDSESSIONWM_ENDSESSIONのメッセージが正しいことかもしれません。

2

私は他の回答を完全にがポイントを逃すと思う:強制的にアプリケーションを終了すると、それはUnixのSIGKILLのようです。 それを処理する方法はありません - 前もってを除きます。前もって処理することは、設定が変更されるたびに設定を保存することです。もちろん、この動作を最適化することができます。たとえば、ディスクアクセスの回数を最小限に抑える(モバイルデバイスの消費電力を考える)場合は、数秒ごとに設定を保存してください。

これは多くの場合、QSettingsによって処理されます。 QSettingsを使用している限り、妥当な動作をします。ファイルを自分で保存している場合は、ファイルをフラッシュしてアトミックファイルの置き換えに近づけるため、QSaveFileを使用してください。書き込みの途中でkill(強制終了)が発生した場合、設定を失わないようにします。

QCoreApplicationによって発信された信号は、アプリケーションが終了するように要求されたときに何かをしたい場合に反応します。これは、メッセージ()を扱うこと、またはUnix上でSIGTERMを扱うことと同等です。 Qtがあなたのために既にそれをしているので、プラットフォーム固有の方法でそれを行うことは無意味です。WM_CLOSEの扱いには全く同じことが言えません。これは、ウィンドウだけが取得するメッセージなので、Qtはすでにそれを処理しているからです。

QAbstractNativeEventFilterをインストールし、WM_ENDSESSIONWM_QUERYENDSESSIONを処理することによって、ログオフ/シャットダウンプロセスに参加することもできます。これは、アプリケーションが終了することを事前に知りたい場合にのみ意味があります。シャットダウン/ログオフを明示的に停止しない限り、それを心配する必要はありません。

+0

私はabouttoQuitは、Linux上でSIGTERMを扱う知りませんでしたが、SIGHUP&SIGINTについて、SIGHUPは、通常のLinuxにログアウト時にアプリケーションに送信され、私はシグナルハンドラを使用する理由、それはあります(Qt way platform specific) –

+0

質問については、アプリケーションが強制終了されているとは言えません。これは、 'SIGKILL'ではなく、正常なシャットダウンシグナルである' SIGTERM'に言及しています。 – qris

関連する問題