2016-11-11 9 views
0

私は、Visual StudioでC + +コンソールアプリケーションを開発し、クレジットカードリーダーでログを記録し、.csvファイルを吐き出しました。しかし、今のプログラムでは、プログラムを正常に終了して.csvを生成するために、ユーザは手動で「終了」をタイプする必要があります。C++コンソールアプリケーションでユーザーが閉じるボタンを押したときにプログラムのクリーンアップを実行する方法は?

私は、技術者以外の人はこれを認識せず、Xボタンを押してデータを失うことができることを知っています。信号を捕まえてプログラムがクリーンアップ作業を完了できるようにする方法はありますか?

プログラムは既にWindows専用ですので、問題はありません。

答えて

0

SetConsoleCtrlHandlerを使用して、ウィンドウキャプションの「X」ボタンを押したときに発生するCTRL_CLOSE_EVENTイベントのコールバックを設定します。

Ctrlキー + Cイベントが異なることに注意してください:それはCTRL_C_EVENTだが、あなたはそれを同じ方法で処理します。Handle CTRL+C on Win32

#include <Windows.h> 

BOOL onConsoleEvent(DWORD event) { 

    switch(event) { 
     case CTRL_C_EVENT: 
     case CTRL_CLOSE_EVENT: 
      // do stuff 
      break; 
    } 

    return TRUE; 
} 

int main(int argc, char* argv[]) { 

    if(!SetConsoleCtrlHandler(onConsoleEvent, TRUE)) { 
     // die 
    } 

    // do stuff 
} 

あなたが言うように、これは、Windows固有で、そのshouldn問題ではない。

あなたがセットアップするハンドラを(はCtrl +Cに相当)SIGINTイベント用ポータブルsignal機能を使用できますが、私の知る限りでは、Windowsのsignal関数がコールバックを持っていません。イベントはXボタンに対応していますので、SetConsoleCtrlHandlerを使用する必要があります。

#include <signal.h> // use `<cstdlib>` in C++ 

void onSigint(int value) { 
    // do stuff 
} 

int main(int argc, char* argv[]) { 

    signal(SIGINT, onSigint); 

    // do stuff 
} 
+0

私はSIGINTや他の終了信号のようなものに精通しています。これは似ていますか? – Koronakesh

+0

@Koronakeshはい、概念的には同じですが、 'SetConsoleCtrlHandler'はより多くの機能を提供し、プラットフォーム固有です。 – Dai

関連する問題