Temporizadores

Iniciado por Juan821, 9 Julio 2014, 03:56 AM

0 Miembros y 1 Visitante están viendo este tema.

Juan821

Como hago para luego de que pase un tiempo el programa haga lo que le ordene por ejemplo que deje digitar un numero por 60 segundos por ejemplo despues de esos 60 segundos no deje digitar nada y salgo un mensaje que me diga ha excedido su tiempo sera con clock() porque se que sleep puede que no sirva

eferion

¿Es un entorno de consola? ¿aplicación de escritorio? ¿usas alguna librería para la interfaz de usuario?

Tu pregunta, así planteada, es demasiado escueta.

Juan821

#2
Es un programa normal en visual studio lo que trato de hacer es esto

Código (cpp) [Seleccionar]
cin>>x /* esto es para que digite algo y lo lea, lo que necesito es
que si se pasan 60 segundos y no ha digitado nada salga el
mensaje de que ha excedido su tiempo y ya siga con lo que
hay abajo de esta linea como por ejemplo*/

if x==w printf("ha ganado");  

Stakewinner00

#3
podrías crear un thread para escribir y un thread para contar el tiempo, en que estas, windows o linux?

también puedes cojer el reloj del PC y con un bucle ir comprobando si pasaron más de 60 segundos

Juan821

Cita de: Stakewinner00 en 14 Julio 2014, 23:10 PM
podrías crear un thread para escribir y un thread para contar el tiempo, en que estas, windows o linux?

también puedes cojer el reloj del PC y con un bucle ir comprobando si pasaron más de 60 segundos
estoy en windows entonces pero con un bucle como?

eferion

Cita de: Juan821 en 15 Julio 2014, 20:19 PM
estoy en windows entonces pero con un bucle como?

la librería estándar de C++ no dispone de métodos que permitan una lectura no bloqueante sobre el buffer de entrada.

La opción sería crear una tarea con un hilo secundario que se encargase de realizar la lectura... en el hilo principal pones una espera activa hasta que pase el tiempo o el usuario introduzca un valor.... si se produce el timeout entonces matas el hilo secundario. Si antes de acabar el tiempo el usuario introduce un valor entonces dejas que el usuario introduzca su valor con normalidad y el programa continua.

kutcher

#6
Cita de: Juan821 en  9 Julio 2014, 03:56 AM
Como hago para luego de que pase un tiempo el programa haga lo que le ordene por ejemplo que deje digitar un numero por 60 segundos por ejemplo despues de esos 60 segundos no deje digitar nada y salgo un mensaje que me diga ha excedido su tiempo

Buenas, la unica forma que se me ocurre para lograr eso sin el uso de hilos, es haciendo uso de las funciónes kbhit() y getche() de la libreria conio.h

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstddef>
#include <ctime>
#include <conio.h>

bool get_input ( char *buffer, std::size_t size, int timeout )
{
   std::time_t start = std::time ( 0 );
   std::size_t n = 0;

   for (;;)
   {
       if ( n == 0 && std::difftime (std::time(0), start ) >= timeout )
           return false;

       if (kbhit()) {
           if ( n == size - 1 )
               break;
           char ch = (int)getche();
           if ( ch == '\r' )
           {
               buffer[n++] = '\n';
               break;
           }
           else
               buffer[n++] = ch;
       }
   }
   buffer[n] = '\0';

   return true;
}

int main(void)
{
   char buffer[20] = {};

   if ( !get_input (buffer, 20, 5) ) {
       std::cout << "Tiempo agotado\n";
       buffer[0] = '\n';
   }
   std::cout<<"\nSalida: " << buffer;

   return 0;
}


Se que la libreria conio.h no es recomendable utilizarla

leosansan

Cita de: Juan821 en 15 Julio 2014, 20:19 PM
...........................estoy en windows ..........................

Pues si estas en Windows podrías usar windows.h para "Sleep" y conio.h para kbhit:

Código (cpp) [Seleccionar]
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <iomanip>

using namespace std;

int main(){
  int i , ss = 5 , algo = 0 ;
  while( !kbhit() ){
    for( i = ss ; i>= 0 ; i-- ){
      if (kbhit()){
        cout << endl;
        break;
      }
    Sleep(1000);
    cout << "Quedan: " << setw(2) << i << " segundos.\r" ;
    }
    if ( i == -1 ) break;
  }
  if ( i> -1){
    cin >> algo;
    cout << endl << "algo= " << algo << endl;
  }
  else cout << endl << "Tiempo excedido\n" << endl;
  return 0;
}


Y reitero lo de kutcher, sí ya sé que no es aconsejable usar conio, pero no se me apetece meterme ahora con las API de Windows.   ;)

¡¡¡¡ Saluditos! ..... !!!!




Juan821

Cita de: leosansan en 16 Julio 2014, 21:11 PM
Pues si estas en Windows podrías usar windows.h para "Sleep" y conio.h para kbhit:

Código (cpp) [Seleccionar]
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <iomanip>

using namespace std;

int main(){
  int i , ss = 5 , algo = 0 ;
  while( !kbhit() ){
    for( i = ss ; i>= 0 ; i-- ){
      if (kbhit()){
        cout << endl;
        break;
      }
    Sleep(1000);
    cout << "Quedan: " << setw(2) << i << " segundos.\r" ;
    }
    if ( i == -1 ) break;
  }
  if ( i> -1){
    cin >> algo;
    cout << endl << "algo= " << algo << endl;
  }
  else cout << endl << "Tiempo excedido\n" << endl;
  return 0;
}


Y reitero lo de kutcher, sí ya sé que no es aconsejable usar conio, pero no se me apetece meterme ahora con las API de Windows.   ;)

¡¡¡¡ Saluditos! ..... !!!!





ya lo probe si sirve pero el problema es que si le dan a una letra y no le dan enter
se pausa la cuenta regresiva he intentando arreglarlo pero no he sido capas aunque muchas gracias que con esto seguire averiguando para perfeccionarlo gracias

vangodp

Cita de: eferion en 16 Julio 2014, 00:07 AM
la librería estándar de C++ no dispone de métodos que permitan una lectura no bloqueante sobre el buffer de entrada.

La opción sería crear una tarea con un hilo secundario que se encargase de realizar la lectura... en el hilo principal pones una espera activa hasta que pase el tiempo o el usuario introduzca un valor.... si se produce el timeout entonces matas el hilo secundario. Si antes de acabar el tiempo el usuario introduce un valor entonces dejas que el usuario introduzca su valor con normalidad y el programa continua.
¿Puedes brindarnos un ejemplo sencillo y/o alguna pagina/pdf/tutorial o lo que sea sobre el tema?
He leído sobre POSIX no POSIX y la verdad es que menudo lio eso de los trheads y procesos.
Pinta bien pero no veas si raya jejeje.