2011-09-19 5 views
0

私はコンソールアプリケーションを作成しています。メインスレッドにいくつかのオブジェクトを作成し、それらをループに蹴り込みます。ユーザーがCtrl- C割り込み。Windows Ctrl-C - コマンドラインアプリケーションでローカルスタックオブジェクトをクリーンアップ

ここでは、http://msdn.microsoft.com/en-us/library/ms685049%28VS.85%29.aspxのような記事に適切な割り込みハンドラを書き込む方法について少しは読んだことがありますが、私はまだ1つのことについて混乱しています。割り込みハンドラがローカルオブジェクトのクリーンアップのための限られた範囲を残すようです。私が持っていた場合例えば、そのようなハンドラ:

BOOL CtrlHandler (DWORD fdwCtrlType) 
    ... handle Ctrl-C 

と私のメインは、このような何かを見て:

int main() { 
     DBClient db; 
     DataPuller p; 

     while (true) { 
      ... do stuff until Ctrl-C comes in 
     } 

私はCtrlキーを押しながらCをキャッチした場合でも、行うには方法はないように思えます変数dbとpを適切にクリーンアップして、グローバルに宣言せずに済むようにします。

これを行うには、より良い方法がありますか、それとも明白なものがありませんか?ありがとう。

+0

なぜ何かをきれいにする必要があります - それらは自動変数です。関数スコープを終了するときに自分自身をきれいにする必要があります。 –

+1

@Kerrek:Ctrl-CはSIGINTシグナルをプロセスに送信します。これが処理されない場合、(信号ハンドラから戻ることなく)アプリケーションが中止されます。したがって、自動変数はクリーンアップされません。 –

+0

@Tux:私はOPが適切な終了条件を設定するだけのシグナルハンドラをインストールしたと思った。 –

答えて

2

条件変数にループを作成します。

ctrl-C(SIGINT)を受け取ったら、条件変数をfalseに設定して戻ります。 ループは正常に終了します。

bool finished = false; 

int main() 
{ 
     DBClient db; 
     DataPuller p; 

     while (!finished) 
     { 
      // ... do stuff until Ctrl-C comes in 
     } 
} 

// Signal handler or Control handler on windows 
// Set finished = true. 
+0

完璧!どうもありがとう – user944775

1

少なくとも1つのグローバルがないとこれはできないと思います。しかし、私はあなただけのいずれかが必要だと思う:

BOOL is_shutting_down = false; 

BOOL CtrlHandler (DWORD fdwCtrlType) { 
    switch(fdwCtrlType) 
    { 
     // Handle the CTRL-C signal. 
     case CTRL_C_EVENT: 
      is_shutting_down = true; 
      return(TRUE); 
    } 
} 

int main() { 
     DBClient db; 
     DataPuller p; 

     while (is_shutting_down == false) { 
      ... do stuff until Ctrl-C comes in 
     } 

     //objects clean themselves automatically. 
} 

側はグローバル「is_shutting_down」の影響、それがtrueに設定されている場合、OSが自動的にそれをすべて取り戻すになるので、デストラクタは、メモリの割り当てを解除する必要がないということですとにかく、小さな割り当てがたくさんある場合、FASTをシャットダウンすることができます。

関連する問題