2012-03-19 39 views
5

Tôi đang cố gắng viết một mô phỏng sẽ tiếp tục chạy cho đến khi tôi nhấn một phím nào đó (như 'q' để thoát). Sau đó, sau khi tôi nhấn phím đó, tôi muốn chương trình hoàn thành việc ghi dữ liệu hiện đang ghi, đóng các tệp, sau đó thoát ra một cách duyên dáng (trái ngược với việc chỉ nhấn ctrl + c để buộc chương trình dừng lại). Có cách nào để làm điều này trên C + +?"Safely" chấm dứt chương trình C++ đang chạy khi nhấn phím?

Cảm ơn

+0

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

+3

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

+0

Đ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

Trả lời

5

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"; 
    } 

} 
+0

Làm thế nào để cài đặt bộ xử lý tín hiệu? – Eddy

+0

@Eddy - Xem chỉnh sửa của tôi. –

Các vấn đề liên quan