質問
私はタイマーを有しており、ソケット通信を行い、また、ロックされたミューテックスを使用してコンソールベースQCoreApplication
を有している。
、それはいくつかのミューテックスがロックされ、それがタイムアウトしていると言ってエラーになります。私は、ユーザーがそれを閉じるときにコンソールアプリケーションでクリーンアップを行うことができますどのような方法がありますか?
解決
クリーンアップはデストラクタと親子関係で処理する必要があります。
あなたのマスターオブジェクト(メインの1)はQApplicationがある前に、それはすべてのチャイルズで破壊されるようにはQApplicationの子を作成します。
あなたはすべてのあなたのスレッドを殺しましたか?それはイベントループとのスレッドがある場合は、QThread::quit()
を呼び出す前に、イベントループを終了するQThread::wait()
を呼び出してください。
また、ボイドQApplication::qAddPostRoutine ( QtCleanUpFunction ptr )
を使用することができます
いくつかの特別なクリーンアップをすることができません。
これらのメッセージをデバッグするために、あなたはQtMsgHandler qInstallMsgHandler ( QtMsgHandler h )
を使用して、これらの警告をキャプチャするために、独自のメッセージハンドラを記述することができます。あなたが問題をシミュレートすることができた場合は、メッセージにブレークポイントを設定し、メッセージがから来ているスタック上で見ることができます。
void debugMessageHandler( QtMsgType type, const char *msg ){
if(QString(msg).contains( "The message you can see in the console" )){
int breakPointOnThisLine(0);
}
switch ( type ) {
case QtDebugMsg:
fprintf( stderr, "Debug: %s\n", msg );
break;
case QtWarningMsg:
fprintf( stderr, "Warning: %s\n", msg );
break;
case QtFatalMsg:
fprintf( stderr, "Fatal: %s\n", msg );
abort();
}
}
<時間>
デストラクタと親子関係船でクリーンアップするためには、コンソールクローズシグナルをキャッチすることができますし、アプリケーションインスタンスにQCoreApplication::exit()
を呼び出します。
#include <csignal>
#include <QtCore/QCoreApplication>
using namespace std;
struct CleanExit{
CleanExit() {
signal(SIGINT, &CleanExit::exitQt);
signal(SIGTERM, &CleanExit::exitQt);
signal(SIGBREAK, &CleanExit::exitQt) ;
}
static void exitQt(int sig) {
QCoreApplication::exit(0);
}
};
int main(int argc, char *argv[])
{
CleanExit cleanExit;
QCoreApplication a(argc, argv);
return a.exec();
}
他のヒント
は、「閉じる」(タイトルバーの赤いXボタン)を押して(win7の&VS2010でチェック)、コマンドラインアプリケーションを終了すると、アプリケーションにSTATUS_CONTROL_C_EXIT
信号を通過させることが判明しました。すべてのスレッドがこのコードで中止されます。
スレッドのメインスレッド '(0x980)は、コード-1073741510で終了しました (0xc000013a)。
スレッドのQThread」(0x2388)がコードで終了しました -1073741510(0xc000013a)。
すなわちQCoreApplication::aboutToQuit()
信号でこれを傍受する方法がないことを意味する。
winnt.h
またはntstatus.h
を見てみましょう。それはに割り当てられた値であります
定数STATUS_CONTROL_C_EXIT
を明示。ランタイムはただであります
ユーザーのキャンセルに注意することは、コードを使用してプログラムを終了することを選択します
操作ます。
あなたは QCoreApplication :: aboutToQuit の信号に接続することができますそしてそこに必要なをクリーンアップします。