2017-06-18 6 views
0

J'ai problème avec ma fonction de sommeil en C.Désactiver mise en file d'exécuter en C

Quand je l'utilise dans cette fonction de sommeil code comme ceci:

while(1) { 
     XNextEvent(display, &xevent); 
     switch (xevent.type) { 
      case MotionNotify: 
       break; 
      case ButtonPress: 
       printf("Button click: [%d, %d]\n", xevent.xmotion.x_root, xevent.xmotion.y_root); 
       sleep(5); 
       break; 
      case ButtonRelease: 
       break; 
     } 

Il ne fonctionne pas bien pour moi parce que printf ("clic de bouton") s'exécute tout le temps mais plus lentement.

Comment imprimer « bouton clic x y » une fois et arrêter l'écoute de clic pendant 5 secondes?

+1

Il est pas clair pour moi ce que vous voulez - 'sleep'ing dans la boucle d'événement n'est pas ce que X a été fait pour. – tofro

+0

Lorsque je clique nulle part sur mon écran i get message "cliquage x, y" Lorsque je clique rapidement 5 fois que je reçois 5 messages mais après 25 secondes. Je souhaite obtenir seulement un message même si je plusieurs fois. – Adrian

Répondre

2

Je pense que vous cherchez quelque chose comme:

/* ignore_click is the time until mouse click is ignored */ 
time_t ignore_click = 0; 

while(1) { 
    XNextEvent(display, &xevent); 
    switch (xevent.type) { 
     case MotionNotify: 
      break; 
     case ButtonPress: 
      { 
       time_t now; 
       /* we read current time */ 
       time(&now); 

       if (now > ignore_click) 
       { 
        /* now is after ignore_click, mous click is processed */ 
        printf("Button click: [%d, %d]\n", xevent.xmotion.x_root, xevent.xmotion.y_root); 

        /* and we set ignore_click to ignore clicks for 5 seconds */ 
        ignore_click = now + 5; 
       } 
       else 
       { 
        /* click is ignored */ 
       } 
      } 
      break; 
     case ButtonRelease: 
      break; 
    } 
} 

Le code écrit ci-dessus va ignorer les clics pour 4 à 5 secondes: le type time_t est une seconde structure de précision ...

Pour obtenir plus de temps acurate, vous pouvez utiliser la structure struct timeval ou struct timespec. Je ne les utilise pas dans mon exemple pour le garder clair.

+0

Merci beaucoup, ça fonctionne bien! – Adrian