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!

1
Jody Arigi 16 nov. 2017 à 14:03

4 réponses

Meilleure réponse

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;
}
2
Samer Tufail 16 nov. 2017 à 11:20

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);
    }
}
-1
Ali Sepehri-Amin 16 nov. 2017 à 11:13

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

0
Hossein 29 avril 2020 à 00:16

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;
  }
1
Ali Ezzat Odeh 16 nov. 2017 à 11:18
47328007