我試圖編寫一個模擬程序,它會繼續運行,直到我按下某個鍵(如'q'退出)。然後在按下之後,我希望程序完成寫入當前寫入的數據,關閉文件,然後正常退出(而不是按ctrl + c強制程序停止)。有沒有辦法在C++上做到這一點?「安全地」在鍵盤上終止正在運行的C++程序?
感謝
我試圖編寫一個模擬程序,它會繼續運行,直到我按下某個鍵(如'q'退出)。然後在按下之後,我希望程序完成寫入當前寫入的數據,關閉文件,然後正常退出(而不是按ctrl + c強制程序停止)。有沒有辦法在C++上做到這一點?「安全地」在鍵盤上終止正在運行的C++程序?
感謝
讓用戶按CTRL - Ç,但安裝一個信號處理程序來處理它。在信號處理程序中,設置一個全局布爾變量,例如user_wants_to_quit
。那麼你的SIM卡環可以是這樣的:
while (work_to_be_done && !user_wants_to_quit) {
…
}
// Loop exited, clean up my data
一個完整的POSIX程序(對不起,如果你希望爲Microsoft Windows),包括設置和恢復SIGINT(CTRL - Ç)處理:
#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 2012-03-22 13:42:43
@Eddy - 看我的編輯。 – 2012-03-22 14:17:06
確實有辦法做到這一點。你需要以某種方式打破你的模擬循環,但檢測到按鍵將成爲踢球者。該程序運行的操作系統是什麼? – djdanlib 2012-03-19 19:41:37
似乎是一個相當廣泛的問題。 1)如何異步讀取密鑰? 2)如何通知程序關閉? 3)在完成關機之前如何確保寫入所有數據? – Almo 2012-03-19 19:42:20
這將在Linux或Mac上運行。最好我希望它是非操作系統的依賴,但如果它是唯一的選擇,那麼unix兼容。基本上我希望有一種方法來'按'按鍵,這樣在模擬的每一次迭代結束時,它都會檢查按鍵是否被按下,然後調用關機功能。 – Eddy 2012-03-19 20:10:15