उपयोगकर्ता प्रेस CTRL है - सी, लेकिन इससे निपटने के लिए एक संकेत हैंडलर स्थापित करें। सिग्नल हैंडलर में, वैश्विक बूलियन वैरिएबल सेट करें, उदाहरण के लिए user_wants_to_quit
।
: - हैंडलर
while (work_to_be_done && !user_wants_to_quit) {
…
}
// Loop exited, clean up my data
एक पूरा POSIX कार्यक्रम (क्षमा करें, अगर आप माइक्रोसॉफ्ट विंडोज के लिए उम्मीद कर रहे थे), की स्थापना सहित और 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";
}
}
स्रोत
2012-03-19 20:33:33
यह निश्चित रूप से ऐसा करने का एक तरीका है। आपको किसी भी तरह अपने सिमुलेशन लूप से बाहर निकलना होगा, लेकिन कीप्रेस का पता लगाना किकर होगा। इस कार्यक्रम पर कौन सा ओएस चलेंगे? – djdanlib
एक बल्कि व्यापक सवाल लगता है। 1) मैं एक कुंजी को असंकालिक रूप से कैसे पढ़ूं? 2) मैं प्रोग्राम को बंद करने के लिए कैसे सूचित करूं? 3) यह सुनिश्चित करने के लिए कि शट डाउन को अंतिम रूप देने से पहले सभी डेटा लिखे गए हैं? – Almo
यह लिनक्स या मैक पर चलने वाला है। अधिमानतः मैं इसे गैर-ओएस पर निर्भर करता हूं, लेकिन यदि यह एकमात्र विकल्प है तो कुछ यूनिक्स संगत है। असल में मैं उम्मीद कर रहा था कि एक कीप्रेस के लिए 'सुनो' करने का एक तरीका था ताकि सिमुलेशन के हर पुनरावृत्ति के अंत में, यह जांच करेगा कि क्या कुंजी दबा दी गई थी, फिर शट डाउन फ़ंक्शन को कॉल करें। – Eddy