8
votes

Fonction de délai d'expiration

Je veux faire un code dans lequel le nom de l'utilisateur sera invité à entrer, mais dans une limite de temps de 15 secondes. Si l'utilisateur franchit la limite et n'a pas réussi à saisir un nom (ou une chaîne de chaîne), le code sera terminé et «Time Out» sera affichage auquel le nom doit être enregistré et «Merci», le massage sera affiché. J'avais essayé comme ça, mais c'est faux et ne fonctionne pas. S'il vous plaît donnez-moi une solution pour cela .. Merci. xxx


2 commentaires

Suggérez en utilisant: getItimer () et Settitimer () (probablement uniquement la fonction Sétititimer () sera nécessaire. Suggérez la page de lecture de l'homme pour < Code> Settitimer ()


Suggérez en utilisant la fonction SELECT () , avec le dernier paramètre étant un struct Timeval avec le contenu étant de 15 secondes


3 Réponses :


4
votes

scanf () n'est pas la meilleure fonction pour obtenir une entrée dans un délai limité.

Au lieu de cela, je construirais une fonction d'entrée spécifique autour de SELECT () (pour gérer le délai d'attente) et lisez () (pour obtenir une entrée) Appels système.


1 commentaires

Merci Mouviciel, pouvez-vous me donner la syntaxe de Select (), avec un exemple d'exemple?



1
votes

Une chose que vous devez penser, c'est que vous avez un seul fil d'exécution dans votre programme. En tant que tel, la fonction ne sera appelée que lorsque la fonction scanf sera terminée. Ce n'est pas ce que vous voulez.

Un moyen de faire cette tâche, est d'utiliser la fonction SELECT . Il attend une quantité de temps potentiellement limitée (votre délai d'attente) pour la disponibilité de l'entrée sur certains descripteurs de fichier ( stdin pour vous).


0 commentaires

15
votes

Probablement ce programme factice pourrait vous aider:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

#define WAIT 3

int main ()
{
    char            name[20] = {0}; // in case of single character input
    fd_set          input_set;
    struct timeval  timeout;
    int             ready_for_reading = 0;
    int             read_bytes = 0;
    
    /* Empty the FD Set */
    FD_ZERO(&input_set );
    /* Listen to the input descriptor */
    FD_SET(STDIN_FILENO, &input_set);

    /* Waiting for some seconds */
    timeout.tv_sec = WAIT;    // WAIT seconds
    timeout.tv_usec = 0;    // 0 milliseconds

    /* Invitation for the user to write something */
    printf("Enter Username: (in %d seconds)\n", WAIT);
    printf("Time start now!!!\n");

    /* Listening for input stream for any activity */
    ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);
    /* Here, first parameter is number of FDs in the set, 
     * second is our FD set for reading,
     * third is the FD set in which any write activity needs to updated,
     * which is not required in this case. 
     * Fourth is timeout
     */

    if (ready_for_reading == -1) {
        /* Some error has occured in input */
        printf("Unable to read your input\n");
        return -1;
    } 

    if (ready_for_reading) {
        read_bytes = read(0, name, 19);
        if(name[read_bytes-1]=='\n'){
        --read_bytes;
        name[read_bytes]='\0';
        }
        if(read_bytes==0){
            printf("You just hit enter\n");
        } else {
            printf("Read, %d bytes from input : %s \n", read_bytes, name);
        }
    } else {
        printf(" %d Seconds are over - no data input \n", WAIT);
    }

    return 0;
}


8 commentaires

À propos, votre ScanF ne fonctionne pas car il s'agit d'un appel de lecture de blocage sur le flux d'entrée.


Merci beaucoup shrey. Voly ce code est très utile pour moi. Parce que j'ai beaucoup d'exemples de sélection () d'Internet, mais ceux-ci étaient très complexes. Ce code est très facile à comprendre et à faire mon travail. Merci 4 votre aide.


Shrey, je remarque que si je retirais \ n à partir de l'instruction Printf, il prend d'abord la fonction Lecture (), puis imprimez le massage de l'instruction Printf (). Quelle devrait être la raison de ça ??


La fonction Lecture () donne également des caractères à déchets en sortie.


@Heet, lu renvoie des ordures car il n'y a pas \ 0 fins de ligne pour ce qui est imprimé. Ainsi, Printf de lecture Essayerait d'écrire tous les 19 caractères même s'ils ne tiennent pas les caractères d'entrée.


@Heet comme pour le commentaire précédent, concernant la lecture avant Printf, c'est-à-dire en raison de la mise en mémoire tampon de ligne. \ n obligerait la sortie sur le terminal (autant que je puisse dire). Probablement, à l'aide d'un appel de chasse (avant lecture) assurerait que tout est à l'écran avant que la lecture soit exécutée.


Pas besoin de rinçage (), Printf est tamponné et une nouvelle ligne est suffisante pour affleurer ce tampon pour sortir du flux.


int Sélection (int NFDS, fd_set * réadaptfs, fd_set * Writefds, fd_set * sauffds, struct Timeval * Timeout); J'ai oublié de modifier la signification et la numérotation des paramètres de sélection ()