私は特定のキー(終了のための 'q'のような)を押すまで実行を継続するシミュレーションを作成しようとしています。その後、私はそれを押した後、プログラムが現在書いているデータを書き終え、ファイルを閉じて、正常に終了するようにしたい(ctrl + cを押してプログラムを強制的に停止するのではなく)。 C++でこれを行う方法はありますか? Cが、それに対処するためのシグナルハンドラをインストールする -実行中のC++プログラムをkeypressで「安全に終了」しますか?
おかげ
私は特定のキー(終了のための 'q'のような)を押すまで実行を継続するシミュレーションを作成しようとしています。その後、私はそれを押した後、プログラムが現在書いているデータを書き終え、ファイルを閉じて、正常に終了するようにしたい(ctrl + cを押してプログラムを強制的に停止するのではなく)。 C++でこれを行う方法はありますか? Cが、それに対処するためのシグナルハンドラをインストールする -実行中のC++プログラムをkeypressで「安全に終了」しますか?
おかげ
は、ユーザーのプレスCTRLを持っています。シグナルハンドラで、グローバルブール変数を設定します(例:user_wants_to_quit
)。
while (work_to_be_done && !user_wants_to_quit) {
…
}
// Loop exited, clean up my data
完全なPOSIXプログラム(申し訳ありませんが、あなたは、Microsoft Windowsのために望んでいたならば)、設定を含むとSIGINTを復元(CCTRL):次に、あなたのシム・ループは、のように見えることができます
#include <iostream>
#include <signal.h>
namespace {
sig_atomic_t user_wants_to_quit = 0;
void signal_handler(int) {
user_wants_to_quit = 1;
}
}
int main() {
// Install signal handler
struct sigaction act;
struct sigaction oldact;
act.sa_handler = signal_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, &oldact);
// Run the sim loop
int sim_loop_counter = 3;
while((sim_loop_counter--) && !user_wants_to_quit) {
std::cout << "Running sim step " << sim_loop_counter << std::endl;
// Sim logic goes here. I'll substitute a sleep() for the actual
// sim logic
sleep(1);
std::cout << "Step #" << sim_loop_counter << " is now complete." << std::endl;
}
// Restore old signal handler [optional]
sigaction(SIGINT, &oldact, 0);
if(user_wants_to_quit) {
std::cout << "SIM aborted\n";
} else {
std::cout << "SIM complete\n";
}
}
シグナルハンドラはどのようにインストールされますか? – Eddy
@Eddy - 私の編集を参照してください。 –
これを行う方法は確かです。何とかあなたのシミュレーションループから脱出する必要がありますが、キーを検出することはキッカーになるでしょう。このプログラムはどのOSで動作しますか? – djdanlib
かなり広い質問のようです。 1)どのように非同期にキーを読み込むのですか? 2)プログラムをシャットダウンする方法を通知するにはどうすればよいですか? 3)シャットダウンを完了する前にすべてのデータが書き込まれていることを確認する方法は? – Almo
これはLinuxやMacで動作します。私はそれがnon-osに依存していることが望ましいですが、それが唯一のオプションであれば、unixと互換性があることが望ましいです。基本的に私は、シミュレーションの各繰り返しの最後に、そのキーが押されたかどうかをチェックし、次にシャットダウン機能を呼び出すように、キー入力を「聴く」方法があることを期待していました。 – Eddy