Blocs d’entrée de la console C ++, donc je ne peux pas tuer le fil

Mon programme comporte de nombreux threads différents, dont l’un sur la saisie de l’utilisateur.

Les autres threads ne bloquent pas beaucoup les appels, et ceux qui bloquent sont basés sur le réseau, ils seront donc interrompus ou reviendront normalement lorsque le socket sera arrêté.

Cependant, le thread utilisateur a des appels à std::cin afin de saisir l’entrée utilisateur. Cela a pour effet que tant que tous les autres threads sont morts, le thread utilisateur bloque toujours ses entrées et ne mourra que lors de la prochaine saisie.

Est-il possible pour moi de vérifier s’il y a une entrée d’utilisateur à saisir avant de bloquer?

Je comprends que cin.peek() existe mais, d’après mon expérience, il se bloque s’il n’ya rien à lire. En supposant que je l’utilise correctement

Mon code est fondamentalement une boucle infinie qui s’arrête lorsqu’un autre thread bascule la variable de condition:

 void doLoop() { while (running) //running is shared between all threads and all others die quickly when it is false. It's set to true before the threads are started { ssortingng input = ""; getline(cin, input); //Handle Input } } 

Je suis sur Windows, j’utilise VS2013 et je ne peux pas utiliser de bibliothèques externes. J’utilise windows.h et std tout au long.

Ce que vous pouvez faire, c’est utiliser des futures pour permettre à l’utilisateur de saisir quelque chose avec une limite de temps. Vous pouvez ensuite insérer ce code dans votre boucle principale

 #include  // std::cout #include  // std::async, std::future #include  // std::chrono::milliseconds #include  using namespace std; bool myAsyncGetline(ssortingng & result) { std::cout<<"Enter something within the time limit"< fut = std::async (myAsyncGetline,res); std::chrono::seconds span (20); if (fut.wait_for(span)==std::future_status::timeout) std::cout << "Too Late!"; else cout<<"You entered "< 

Ceci est disponible dans VS2012, vous devriez donc pouvoir le reproduire.

Le résultat est "Tool Late!" Si getline fonctionne toujours après le délai d'attente (20 secondes), le résultat est sinon affiché.

Je pense qu'il est plus simple que de déconner avec le fil meursortinger, car la fonction s'arrête d'elle-même si la limite de temps est atteinte. Dites-moi si vous avez besoin d'aide pour l'intégrer dans votre code existant, je peux vous aider.

Je crois que la norme C ++ n’offre pas un moyen de vérifier l’entrée standard sans bloquer. Puisque vous êtes prêt à utiliser des fonctions spécifiques à votre plate-forme, ‘kbhit ()’ peut vous convenir, mais il est obsolète dans Windows. Une alternative est proposée, _kbhit() . Bien sûr, ce n’est pas portable sur d’autres plateformes.

C’est le lien vers MSDN: _kbhit