Saltar al contenido

Entrada con un tiempo de espera en C++

Buscamos en distintos sitios para tener para ti la respuesta a tu duda, en caso de dudas deja tu pregunta y te contestaremos con gusto.

Solución:

Lo que está tratando de hacer es tener una lectura sin bloqueo (asincrónica) de stdin con un tiempo de espera de 10 segundos. Esto no es demasiado difícil, pero puede involucrar muchos conceptos nuevos dependiendo de su nivel actual.

los key el concepto aquí es que cin >> password; es un bloqueando llamada, es decir, hasta que se complete, el control no fluirá más en este código. Por lo tanto, debemos hacer que no bloquee de alguna manera, o mantenerlo bloqueado y salir de él cuando expire el tiempo de espera.

Existen algunas implementaciones comunes basadas en los requisitos de diseño y las limitaciones del sistema. Cada implementación es diferente según el sistema operativo, pero las técnicas son muy similares.

1. Asíncrono: STDIN con tiempo de espera
Este enfoque se usa comúnmente en la programación de redes y se puede extender a otras formas de entrada, como el caso actual.

  1. Coloque el identificador de entrada estándar (STDIN) (identificador = 0) en una ‘lista de vigilancia’.
  2. Coloque un tiempo de espera en la lista de vigilancia.
  3. Siempre que haya un cambio en el STDIN, procesarlo.
  4. Cuando haya expirado el tiempo de espera, compruebe si lo que hemos procesado hace el trabajo.

En Linux (y muchas otras variantes de Unix), la lista de observación se puede manejar usando FD_SET y un select llamada del sistema. En Windows, necesitará usar WaitForMultipleEvents.

No estoy seguro de poder hacer justicia al explicar estos conceptos con precisión para los propósitos de esta pregunta. Como referencia, otra pregunta que tiene algunos indicadores de código para exactamente lo mismo está aquí.

2. Síncrono: multiproceso con interrupción
Esta es una técnica común utilizada para los casos en los que necesitamos un programador/temporizador de eventos detallado.

  1. Crear dos hilos, A y B.
  2. A esperará en el tiempo de espera indicado.
  3. B esperará una lectura de bloqueo
  4. Si A termina (se agota el tiempo) antes B acabados, A señales B y B decide qué hacer a continuación (terminar, repetir un mensaje, etc.)
  5. Si B lee la contraseña y está bien, B señales A y le pide que muera.

Otra forma de lograr lo mismo es hacer que el sistema operativo interrumpa el hilo. B como se describe en uno de los comentarios.

3. Sincrónico: Sondeo
Esto se usa para casos en los que no necesitamos un control demasiado detallado a lo largo del tiempo.

  1. Verifique si hay algo en la entrada usando una lectura sin bloqueo (kbhit())
  2. Si no hay ninguno, y si queda tiempo en el tiempo de espera, espere una cantidad de tiempo menor delta (decir 10ms)
  3. Si el tiempo de espera expiró y no queda más tiempo, realice el procesamiento necesario (mensaje al usuario, salida, etc.)

Tenga en cuenta que en este caso, dependiendo de la delta, el enfoque puede consumir mucha CPU y puede ser ineficiente. Por ejemplo, si delta=10ms como se indicó anteriormente, el subproceso se activará 100 veces por segundo y no será eficiente, especialmente cuando los usuarios no escriben caracteres en su teclado tan rápido.

Si crees que te ha sido útil este post, agradeceríamos que lo compartas con otros entusiastas de la programación y nos ayudes a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *