elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como hacer que un bucle se ejecute durante X milisegundos en linux
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como hacer que un bucle se ejecute durante X milisegundos en linux  (Leído 3,978 veces)
Patofet

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Como hacer que un bucle se ejecute durante X milisegundos en linux
« en: 17 Agosto 2012, 20:59 pm »

Hola, voy directamente al grano, estoy intentando ejecutar un bucle durante X milisegundos en linux, en windows lo he conseguido hacer así:

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <time.h>
  7. #include "funciones.h"
  8.  
  9.  char iesperaMirandoTecla(int milisegundos){ //Hace esperar "milisegundos" milisegundos mientras va mirando por teclado si se esta pulsando alguna tecla
  10.        char caracter='\0';
  11.        int contador=0;
  12.        clock_t final=clock()+(milisegundos*(CLOCKS_PER_SEC/1000));
  13.        init_keyboard();
  14.        while(( clock() < final) && (caracter=='\0')){
  15.            if(kbhit()){
  16.                caracter = readch();
  17.                printf("\b ");
  18.            }
  19.            esperaMilisegundos(1);
  20.            contador++;
  21.        }
  22.        close_keyboard();
  23.        return caracter;
  24.    }

pero en linux pongo lo mismo y no funciona, en principio todo(vale casi todo lo del teclado no) esta en ANSI C y en linux no me funciona y no logro entender y no logro saber el porque ..., ¿alguien tiene alguna idea?

Gracias de antemano

P:D: Aclaración: Seria question de antes de entrar al bucle preguntarle al sistema la "hora" y luego a cada aliteracion del bucle mirar la hora que es y mirar si se ha pasado del tiempo


« Última modificación: 17 Agosto 2012, 22:21 pm por Patofet » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Como hacer que un bucle se ejecute durante X milisegundos en linux
« Respuesta #1 en: 17 Agosto 2012, 21:51 pm »

No he entendido muy bien lo que quieres hacer, pero puedes buscar sobre la funcion usleep().

Saludos.


En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Patofet

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Como hacer que un bucle se ejecute durante X milisegundos en linux
« Respuesta #2 en: 17 Agosto 2012, 22:20 pm »

no, con usleep() no hay forma de controlar que el bucle se ejecute durante exactamente X milisegundos, ya que las funciones que leen por teclado y estas cosas hacen "perder el tiempo" al procesador. Seria question de antes de entrar al bucle preguntarle al sistema la "hora" y luego a cada aliteracion del bucle mirar la hora que es y mirar si se ha pasado del tiempo
En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: Como hacer que un bucle se ejecute durante X milisegundos en linux
« Respuesta #3 en: 17 Agosto 2012, 23:05 pm »

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/select.h>
  5. #include <termios.h>
  6. #include <unistd.h>
  7.  
  8.  
  9. char kbPeek(int msTimeOut)
  10. {
  11.    /* Antiguo y nuevo estado de la terminal con y sin modo ICANON */
  12.    struct termios prevTIOS;
  13.    struct termios newTIOS;
  14.  
  15.    /* Agregamos el timeout a una estructura timeval */
  16.    struct timeval tvTimeout;
  17.        tvTimeout.tv_usec = msTimeOut * 1000; /* mili -> micro */
  18.  
  19.    /* Armamos un fd_set con STDIN para pasarlo a select() */
  20.    fd_set readSet;
  21.        FD_ZERO(&readSet);
  22.        FD_SET(STDIN_FILENO,&readSet);
  23.  
  24.  
  25.    /* Guardamos el termios original con el modo canonico levantado
  26.      * y lo desactivamos, pasando a modo RAW */
  27.  
  28.    tcgetattr(0,&prevTIOS);
  29.    memcpy(&newTIOS,&prevTIOS,sizeof(struct termios));
  30.  
  31.    cfmakeraw(&newTIOS);
  32.    tcsetattr(0,TCSANOW,&newTIOS);
  33.  
  34.    /* Pedimos a select que revise el descriptor de fichero STDIN
  35.        esperando hasta determinado tiempo puesto en tvTimeOUT */
  36.    int retval = select(1,&readSet,0,0,&tvTimeout);
  37.  
  38.    if ( retval == -1)
  39.        perror("select()"); /* Algo salio mal */
  40.  
  41.    else if (retval == 0)
  42.        return 0; /* No paso nada */
  43.  
  44.    /* Si paso algo ... usemos read() para pedir un caracter */
  45.    char peekedChar;
  46.        read(STDIN_FILENO,&peekedChar,1);
  47.  
  48.    /* Volvemos al modo canonico y retornamos valor */
  49.    tcsetattr(0,TCSANOW,&prevTIOS);
  50.  
  51.    return peekedChar;
  52. }
  53.  
  54.  
  55.  
  56. int main(int argc, char *argv[])
  57. {
  58.    /* Aca guardamos cuanto queremos esperar y el caracter en cuestion */
  59.    int msTimeout = 900;
  60.    char readValue;
  61.  
  62.    /* Usamos \r\n por que solo dentro de kbPeek() estamos en modo RAW */
  63.    printf("Esperando %dms una tecla ...\r\n",msTimeout);
  64.  
  65.    /* Largamos kbPeek*/
  66.    readValue = kbPeek(msTimeout);
  67.  
  68.    /* Mostramos */
  69.    printf("Leido : %c \r\n", readValue );
  70.  
  71.    return EXIT_SUCCESS;
  72. }
  73.  
  74.  

No recuerdo cuan portable es termios (dentro de *nix, en teoría es algo *portable*), though ... de todas maneras, si tenés un código Windows, vas a tener que usar preprocesador te guste o no, así que la portabilidad es lo de menos si podés agregar diferentes implementaciones vía preprocessor.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines