質問

私はタイマーを有しており、ソケット通信を行い、また、ロックされたミューテックスを使用してコンソールベース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 の信号に接続することができますそしてそこに必要なをクリーンアップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top