Có báo chí sử dụng CTRL - C, nhưng cài đặt một xử lý tín hiệu để đối phó với nó. Trong trình xử lý tín hiệu, hãy đặt biến boolean chung, ví dụ: user_wants_to_quit
. Sau đó, vòng lặp sim của bạn có thể trông giống như:
while (work_to_be_done && !user_wants_to_quit) {
…
}
// Loop exited, clean up my data
Một chương trình hoàn chỉnh POSIX (xin lỗi, nếu bạn đang hy vọng cho Microsoft Windows), bao gồm thiết lập và khôi phục SIGINT (CTRL - C) handler:
#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";
}
}
Nguồn
2012-03-19 20:33:33
Chắc chắn có cách để thực hiện việc này. Bạn sẽ cần phải thoát ra khỏi vòng lặp mô phỏng của bạn bằng cách nào đó, nhưng phát hiện các phím bấm sẽ là kicker. Chương trình này sẽ chạy trên hệ điều hành nào? – djdanlib
Dường như một câu hỏi khá rộng. 1) Làm cách nào để đọc khóa không đồng bộ? 2) Làm cách nào để tôi thông báo cho chương trình tắt? 3) Làm thế nào để đảm bảo tất cả các dữ liệu được viết trước khi hoàn tất việc tắt máy? – Almo
Điều này sẽ được chạy trên linux hoặc mac. Tốt hơn là tôi muốn nó không phụ thuộc vào os, nhưng nếu đó là lựa chọn duy nhất thì một cái gì đó unix tương thích. Về cơ bản tôi đã hy vọng có một cách để 'lắng nghe' cho một phím bấm để vào cuối mỗi lần lặp của mô phỏng, nó sẽ kiểm tra nếu phím đó đã được nhấn, sau đó gọi một chức năng tắt máy. – Eddy