2012-01-11 17 views
6

問題は次のとおりです。アプリケーションが何かを積極的に実行していないときに閉じると、正常に終了します。しかし、何かに積極的に働いている(例えば、whileループで待っている)場合、メインウィンドウは閉じますが、プログラムはバックグラウンドで実行され続けます。MainWindowが閉じられた後でもQtアプリケーションがメモリに残ります

私はこの問題をグーグルで、今日の良い部分を費やして、可能な修正を実施したが、無駄にしました。 quit()関数は単純に何もしないようです。私が試したことがいくつかあります:

  • app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));を使用しています。 &app, SLOT(quit())qApp, SLOT(aboutQt())に変更しようとしたため、信号がトリガされたことがわかりました。aboutQtウィンドウが一時的にポップアップしました。
  • メインウィンドウのボタンから実行される機能の先頭にqApp->quit();が含まれています。アプリケーションはその行に対して実行されますが、効果はありません。
  • processEvents()を使用して、GUIが更新されていることを確認してください。
  • mainWindow.setAttribute(Qt::WA_QuitOnClose);のような文をmain.cppに含めます。

メインウィンドウが閉じられたとき、私はちょうど完全に終了への応用をしたいです。

それはすべての違いを、私は、qextserialportライブラリを使用しています。

+0

アプリケーションはマルチスレッドですか? – Lol4t0

+0

私は個人的にスレッドを作成していませんが、私が使っているライブラリがあれば分かりません。私がデバッガを開き、スレッドの下を見ると、 "ntdll!ldrFindResourceEx_U"の束が表示されます。私はタスクマネージャプロセスで私のプログラムの1つのインスタンスしか見ません。 PS:改行を作成するのではなく、メッセージを送信するのはなぜでしょうか? – SharpHawk

+0

メインスレッドはそれらのスレッドが作業を終了するのを待つかもしれません。暗黙的に行うことができます。たとえば、オブジェクトのデストラクタがスレッドの終了を待つなどです。あなたの図書館のコードを勉強してください。 PS qextserialportは、私が知っている限り、スレッドを作成しません。 – Lol4t0

答えて

1

私が間違っているのか分からないが、あなたのスロットは、実際に信号を受信すると、あなたは、回避策として、そのスロット関数からexit()を呼び出すことができます。

+0

私はそれが悪い解決策だと思う、なぜなら、そのような終了の後、別のスレッドでアプリケーションの処理が何か処理されると、TSはいくつかのデータを壊す可能性があるからです – Lol4t0

関連する問題