2012-03-19 5 views
5

मैं एक सिमुलेशन लिखने की कोशिश कर रहा हूं जो तब तक चलता रहेगा जब तक कि मैं एक निश्चित कुंजी दबाता हूं (जैसे 'क्यू' छोड़ने के लिए)। फिर जब मैं इसे दबाता हूं, तो मैं चाहता हूं कि प्रोग्राम वर्तमान में लिखने वाले डेटा को लिखना बंद कर दे, फाइल बंद कर दे, फिर शानदार ढंग से बाहर निकलें (जैसा कि प्रोग्राम को रोकने के लिए मजबूर करने के लिए केवल Ctrl + c दबाकर)। क्या सी ++ पर ऐसा करने का कोई तरीका है?कुंजीपटल पर चल रहे सी ++ प्रोग्राम को "सुरक्षित रूप से" समाप्त करें?

धन्यवाद

+0

यह निश्चित रूप से ऐसा करने का एक तरीका है। आपको किसी भी तरह अपने सिमुलेशन लूप से बाहर निकलना होगा, लेकिन कीप्रेस का पता लगाना किकर होगा। इस कार्यक्रम पर कौन सा ओएस चलेंगे? – djdanlib

+3

एक बल्कि व्यापक सवाल लगता है। 1) मैं एक कुंजी को असंकालिक रूप से कैसे पढ़ूं? 2) मैं प्रोग्राम को बंद करने के लिए कैसे सूचित करूं? 3) यह सुनिश्चित करने के लिए कि शट डाउन को अंतिम रूप देने से पहले सभी डेटा लिखे गए हैं? – Almo

+0

यह लिनक्स या मैक पर चलने वाला है। अधिमानतः मैं इसे गैर-ओएस पर निर्भर करता हूं, लेकिन यदि यह एकमात्र विकल्प है तो कुछ यूनिक्स संगत है। असल में मैं उम्मीद कर रहा था कि एक कीप्रेस के लिए 'सुनो' करने का एक तरीका था ताकि सिमुलेशन के हर पुनरावृत्ति के अंत में, यह जांच करेगा कि क्या कुंजी दबा दी गई थी, फिर शट डाउन फ़ंक्शन को कॉल करें। – Eddy

उत्तर

5

उपयोगकर्ता प्रेस 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"; 
    } 

} 
+0

सिग्नल हैंडलर कैसे स्थापित करेगा? – Eddy

+0

@Eddy - मेरा संपादन देखें। –

संबंधित मुद्दे