2016-12-03 1 views
3

J'essaie d'exécuter une boucle while jusqu'à ce que la touche enter soit enfoncée sur le terminal, mais autant que je sache, la boucle s'arrête sur cin.get() jusqu'à ce que quelque chose soit reçu. Existe-t-il un moyen de rendre facultatif l'entrée du terminal et de réexécuter la boucle while? Voici la boucle du code, si je retire les parties cin.get() cela fonctionne bien, je ne peux pas l'arrêter.Exécution d'une boucle while jusqu'à réception d'une entrée spécifique, mais réexécution si rien n'est reçu C++

 while (true) { 

     // In each iteration of our main loop, we run the Myo event loop for a set number of milliseconds. 
     hub.run(1); 

     // Extract first timestamp from Myo (string casted as a number) 
     if (tstart == 0){ 
      stringstream myStream(collector.stampTime); 
      myStream >> tstart; 
     } 

     // Extracting samples from DataCollector 
     std::array<float, 3> acceData = collector.acceSamples; 
     std::array<float, 3> gyroData = collector.gyroSamples; 
     std::array<float, 3> oriData = collector.oriSamples; 
     std::array<int8_t, 8> emgData = collector.emgSamples; 

     for (int i = 0; i < emgData.size(); i++){ 

      if (i < 3) { 
       // Accelerometer samples 
       acce[i] = acceData[i]; 
       pAcce[i] = acce[i]; 

       // Gyroscope samples 
       gyro[i] = gyroData[i]; 
       pGyro[i] = gyro[i]; 

       // Orientation samples 
       ori[i] = oriData[i]; 
       pOri[i] = ori[i]; 
      } 

      // EMG samples 
      emg[i] = emgData[i]; 
      pEMG[i] = emg[i]; 
     } 

     /* 
     * Plot the result 
     */ 
     engPutVariable(ep, "Acce", Acce); 
     engPutVariable(ep, "Gyro", Gyro); 
     engPutVariable(ep, "Ori", Ori); 
     engPutVariable(ep, "EMG", EMG); 
     engEvalString(ep,"EMG_gather"); 

     // Extract timestamps from Myo (string casted as a number) and compute elapsed time 
     stringstream myStream(collector.stampTime); 
     myStream >> tend; 
     elapsedTime = (tend - tstart)/1000000; 

     // Keep track of how many runs Myo has performed 
     x++; 
     if (x % 30 == 0){ 
      std::cout << x << endl; 
     } 


     if (cin.get() == '\n') 
      break; 
     else if (cin.get() == '') 
      continue; 
    } 
+0

Cela ne peut pas être fait en C++ standard, vous avez besoin d'une API spécifique à la plate-forme. – Eugene

+0

Eugène, ce n'est pas vrai. Par exemple, vous pouvez avoir un thread séparé qui lit les données de manière bloquante et utilise la variable de condition pour notifier le thread de travail. Mais il devrait y avoir un moyen plus facile. –

Répondre

0

Cela dépend de la complexité que vous voulez que l'entrée soit, mais en fonction de ce que vous avez posté, vous pouvez également utiliser la fonction std::signal comme ceci:

#include <iostream> 
#include <csignal> 

namespace { 
    volatile std::sig_atomic_t m_stop; 
} 

static void app_msg_pump(int sig) 
{ 
    if (sig == SIGINT || sig == SIGTERM) { 
     m_stop = sig; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    m_stop = 0; 
    std::signal(SIGINT, &app_msg_pump); // catch signal interrupt request 
    std::signal(SIGTERM, &app_msg_pump); // catch signal terminate request 
    while (m_stop == 0) { 
     // your loop code here 
    } 
    std::cout << "Stopping.." << std::endl; 
    // your clean up code here 
    return 0; 
} 

Cela se déroulera jusqu'à l'utilisateur appuie sur CTRL+C (le gestionnaire de touches d'interruption de signal de console habituel), vous pouvez modifier le code ci-dessus pour ignorer la touche et gérer le fait qu'un utilisateur a demandé l'interruption.

Espérons que cela peut aider.

+0

Est-ce que 'std :: cout <<' est sécuritaire pour le signal? J'ai mes doutes. J'ai eu mes programmes coincés dans une impasse 'malloc' un trop de fois pour le savoir, maintenant je viens de mettre un' std :: sig_atomic_t 'volatile et de revenir. –

+0

bonne capture @TheVee .. comportement non défini fonctionne comme vous l'attendez parfois sur certaines plates-formes, mais est encore indéfini :) 'std :: cout' n'est pas tellement" signal-safe ", il est juste indéfini pour appeler une bibliothèque standard fonctionner à partir d'un gestionnaire de signal installé par l'utilisateur de la manière que j'avais initialement affichée. – txtechhelp