J'ai une boucle infinie qui devrait être terminée si j'appuyais sur une touche. Le programme fonctionne sous Linux. Je suis tombé sur une fonction Voici un peu de mon code:
int main(){
While(1){
ParseData(); //writing data to a text file
}
return 0;
}
Donc je sais que je peux terminer le processus en utilisant ctrl + c dans le terminal, mais il semble que cela interrompra le processus d'écriture afin que les données ne soient pas complètement écrites à mi-chemin du processus. J'ai lu que je devais utiliser la fonction de la bibliothèque ncurses, mais je ne comprends pas tout à fait.
Quelqu'un peut-il m'aider? Merci!
4 réponses
Vous pouvez déclarer un atomic_bool
et déplacer votre boucle principale vers un autre thread. Vous pouvez maintenant attendre avec un simple cin
, une fois que l'utilisateur appuie sur une touche, vous quittez votre boucle.
std::atomic_boolean stop = false;
void loop() {
while(!stop)
{
ParseData(); // your loop body here
}
}
int main() {
std::thread t(loop); // Separate thread for loop.
// Wait for input character (this will suspend the main thread, but the loop
// thread will keep running).
std::cin.get();
// Set the atomic boolean to true. The loop thread will exit from
// loop and terminate.
stop = true;
t.join();
return 0;
}
La méthode C
en fait (incluez conio.h
):
char key;
while (1)
{
key = _getch();
// P to exit
if (key == 'p' || key == 'P')
{
writer.close();
exit(1);
}
}
Thread.cpp
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<bool> dataReady(false);
void waitingForWork(){
std::cout << "Waiting... " << std::endl;
while ( !dataReady.load() ){
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
std::cout << "Work done " << std::endl;
}
int main(){
std::cout << std::endl;
std::thread t1(waitingForWork);
std::cout << "Press Enter to Exit" << std::endl;
std::cin.get();
dataReady= true;
t1.join();
std::cout << "\n\n";
}
G ++ -o thread thread.cpp -std = c ++ 11 -pthread
Pourquoi avez-vous besoin d'une clé pour quitter un programme qui n'a pas fini d'écrire dans un fichier, même si vous faites sortir la boucle en appuyant sur une touche, cela interrompra également l'écriture du fichier si elle n'est pas terminée.
Pourquoi vous quittez simplement la boucle lorsque les données ont fini d'écrire dans le fichier, comme suit:
isFinished = false;
While(!isFinished ){
ParseData(); //writing data to a text file
//after data finsihes
isFinished = false;
}