JayKay
JayKay

Reputation: 183

Breaking out of an infinite loop

Is there a way to break out of an infinite loop while it's running without using Ctrl + C? I would like to implement such a method in other programs. Like in this example program:

#include <iostream>

int main()
{
     int x = 0;
     for(;;)
         cout << x;
}

is there a way to keep the for loop going but break it with some key at any time. I should also explain I understand using break;, but I want the loop to keep going. If I use a break condition like this, the for-loop would stop and wait for a response.

#include <iostream>

int main()
{
     int x = 0;
     for(;;)
     {
         cout << x;
         if(getch()=='n')
                break;
     }  

}

Upvotes: 0

Views: 7965

Answers (1)

shuttle87
shuttle87

Reputation: 15934

Find some condition that you wish to break out of the loop when encountered then use the break keyword:

#include <iostream>

int main()
{
     int x = 0;
     for(;;)
         cout << x;
         if(/* break condition*/){
             break;
         }
}

There's nothing stopping you from implementing the break condition by detecting a particular keyboard input from a user.

EDIT: From your edited question it appears you want to have loop continue running all the time and not stopping waiting for user input. The only way I can think of doing this is to spawn a new thread that listens for user input that alters a variable that gets detected in the break condition of your main thread.

If you have access to c++11 and the new thread library you could do something like this:

#include <iostream>
#include <thread>

bool break_condition = false;

void looper(){
    for(;;){
        std::cout << "loop running" << std::endl;
        if(break_condition){
            break;
        }
    }
}

void user_input(){
    if(std::cin.get()=='n'){
        break_condition = true;
    }
}

int main(){
    //create a thread for the loop and one for listening for input
    std::thread loop_thread(looper);
    std::thread user_input_thread(user_input);

    //synchronize threads
    loop_thread.join();
    user_input_thread.join();

    std::cout << "loop successfully broken out of" << std::endl;
    return 0;
}

If you do decide to take a threading approach be careful as there's issues in multithreaded code that don't exist in single threaded code and they can sometimes be really nasty.

Upvotes: 3

Related Questions