2012-02-20 9 views
2

私はWin32/* nixコンソールベースのASCIIゲームを作ろうとしています。私は標準C++でないライブラリーも* nix/windows(.h)でもないライブラリーは使用しません。C++:ウィンドウが閉じようとしているかどうかを確認するにはどうしたらいいですか?

ゲームループのように構成したいと思っています。別名:

while (!WIN_CLOSE_FUNCTION()) { 
    //Do crap 
} 
//Do other shutdown crap 
return 0; 

誰でも私にどのような機能を教えてもらえますか?プラットフォームに依存している場合は、Windowsと* nixの1つの例を教えてください。

答えて

2
あなた What happens when you close a c++ console application

受け入れ答えを助けるかもしれない

同様の質問がある: は、あなたがコントロールハンドラを設定した場合、あなたがキャッチし、プロセス可能性が上隅にある「X」とC++コンソールアプリケーションをCTRL_CLOSE_EVENTをスロー閉じますSetConsoleCtrlHandler関数を使用します。

便利なリンク:* nixの上

Linuxや他のUNIXシステムでは、コンソールが別のプロセスとして実行されます。シェルを閉じると、バックグラウンドで実行されていない現在アクティブなプロセスにSIGHUPシグナルが送信されます。プログラマーがそれを処理しない場合、プロセスは単に終了します。ターミナルとアクティブプロセスでSSHセッションを閉じると、同じシグナルが送信されます。 UNIX/Linuxコンソールについて

+0

私はそれを調査することを確認します。しかし、それはWin32だけです、あなたは* nixの例も提供できますか? – Jode

+0

は答えを編集しました。それは他の質問の答えです –

3

上記のリンク質問に@Zyxによって提供さ

答えは、そのような機能はありません。あなたができることは、端末を失うときに送信される信号SIGHUPをキャッチすることです。しかし、シグナルハンドラでできることは非常に限られていることに注意してください。

#include <signal.h> 

volatile sig_atomic_t hupflag = 0; 

extern "C" void hangup(int) 
{ 
    hupflag = 1; 
} 

int main() 
{ 
    sigaction act; 
    act.sa_handler = hangup; 
    act.sa_mask = 0; 
    act.sa_flags = 0; 
    if (sigaction(SIGHUP, &act, 0) < 0) 
    { 
    std::cerr << "could not install signal handler\n"; 
    return 1; 
    } 

    while (!hupflag) 
    { 
    // ... 
    } 
    // shutdown 
    return 0; 
} 
1

な機能自体はありませんが、UnixとWindowsの両方には、Windowsの下で、Unixの下( SIGBREAKSIGHUPを信号が送信されます:おそらくあなたのループに最も近い(:未テストコードノート)になります)プロセスグループ内のすべての プロセスに、 グループが依存するプロセスが終了したときに、プロセスを終了します。

#ifdef _WIN32 
int const sigClosed = SIGBREAK; 
#else 
int const sigClosed = SIGHUP; 
#endif 

volatile sig_atomic_t windowClosed = 0; 

void signalHandler(int) 
{ 
    windowClosed = 1; 
} 

// ... 
signal(sigClosed, signalHandler); 
while (windowClosed == 0) { 
    // ... 
} 

あなたは、ループ内のコンソールからの入力をやっている場合、あなたは があるでしょう:だからあなたがしなければならないすべては、あなたがループでテストされ、信号をキャッチし、 がフラグを設定しています入力が失敗するように準備しておいてください(とにかく)。

関連する問題