Comment utiliser une minuterie en C++ pour forcer l'entrée dans un temps donné?
Je veux mettre en œuvre un temps hors fonction en C++.
Si l'utilisateur n'a pas de saisie de la valeur dans les 2 secondes, puis le programme doit afficher le délai d'instruction et de demander à l'entrée
EX(SORTIE ÉCRAN):
Timer=0;
Please enter the input: //if input is not given within 2 seconds then
Time-out: 2 seconds
Timer again set to 0
Please enter the input: //if input is not given within 2 seconds then
Time-out: 2 seconds
Timer again set to 0
Please enter the input:22
Data accepted
Terminate the program`
Code:
#include<iostream>
#include<time.h>
using namespace std;
int main()
{
clock_t endwait;
endwait = 2000 ;
cout<<endwait;
while (clock() < endwait)
{
cout<<"Please enter the input:";
}
return 0;
}
J'ai travaillé sur le code ci-dessus. Mais cela arrive seulement en entrant dans la boucle WHILE. Comment dois-je le faire de manière à ce que, je reçois la sortie requise.
Il n'y a pas de norme propre façon d'accepter l'entrée seulement pour un temps limité,
Vous devez faire la fonction obtenir de l'entrée d'un fil et peut utiliser les wait_for
pouvez-vous développer?
Plate-forme spécifique, d'attente pour l'événement keypress. Quelle plateforme utilisez-vous?
Windows 7 avec Codeblocks
Vous devez faire la fonction obtenir de l'entrée d'un fil et peut utiliser les wait_for
pouvez-vous développer?
Plate-forme spécifique, d'attente pour l'événement keypress. Quelle plateforme utilisez-vous?
Windows 7 avec Codeblocks
OriginalL'auteur Ankita Rane | 2015-03-09
Vous devez vous connecter pour publier un commentaire.
De sortie:
OriginalL'auteur Akki
J'ai peur, il n'est pas possible, de manière standard, car les opérations d'e/S bloc, par défaut, le processus appelant jusqu'à ce qu'il est finalisé ou une erreur s'est produite.
Vous pouvez travailler autour de par la création d'un thread qui vérifie si l'entrée a été complété et allez dormir, si nécessaire. Mais ce n'est pas vraiment pratique.
Le problème réside dans l'abstraction
iostream
/FILE
s vous donner: vous n'avez pas accès à la source sous-jacente, celle du système d'exploitation "comprend" et donc capable de vous donner ce genre de fonctionnalités (à savoir, I/O d'interrogation).OriginalL'auteur edmz
Un thread séparé n'est pas suffisant, parce que la console de la fonction de lecture est toujours en cours après le délai d'attente se produit.
Sur POSIX, vous pouvez définir un minuteur qui produit un signal et les causes de la lecture à l'échec avec
-EINTR
.Sur Windows, vous pouvez mettre en œuvre le faible niveau de la console d'e/S des dépassements de délais avec
ReadConsoleInput
etWaitForSingleObject
... mais alors vous avez besoin pour faire votre propre mise en mémoire tampon.Une autre idée serait d'utiliser
ReadFile
dansOVERLAPPED
mode et attendre l'achèvement de l'événement avec un délai d'attente, mais cela ne fonctionne pas pour les consoles, voir L'utilisation de chevauchement IO pour l'entrée de la console?Enfin, les nouvelles versions de Windows (Vista et versions ultérieures) vous permettre de surmonter le "blocage de la lecture n'est pas annulée par timeout" problème à l'aide de
CancelIoEx
. Si vous l'appeler à partir d'un thread séparé, il va déclencherReadFile
de revenir plus tôt; vous n'aurez pas à mettre en œuvre la ligne de mise en mémoire tampon de vous-même.OriginalL'auteur Ben Voigt
J'ai utilisé kbhit() fonction pour résoudre votre problème. Le code est comme suit:-
OriginalL'auteur Naman Gupta
Je pense qu'il n'est pas nécessaire d'utiliser le code complexe (multithreading ou mutex) à cette fin. Voir le code ci-dessous :
OriginalL'auteur Akash