La Web del Programador: Comunidad de Programadores
 
    Pregunta:  7005 - LEER MIENTRAS SE EJECUTA EL PROGRAMA
Autor:  Cesar Ramos
Hola,
Me gustaría sabar si existe alguna forma de leer (introducir datos) a un programa, mientras este se está ejecuntando. Es decir el programa hace unos calculos a partir del valor que le entramos por teclado. Alguien sabe si puedo realizar que mientras siga calculando, pueda introducir el dato y cambie los calculos 'al vuelo'. Espero que me haya explicado, y si alguien tiene alguna idea me la haga saber.

PD. Programando en C.

  Respuesta:  Luis Alfonso
Para mejorar el programa que te he indicado lo mejor que podrías hacer es invocar al procedimiento que realiza los cálculos un mayor número de veces que al que lee los datos, dado que la velocidad con la que pulsaras las teclas no requiere una atención tan rápida, es decir, no requiere un periodo tan pequeño. Ajusta el valor del contador y mira a ver cual es el valor que mejor se adapta a tus necesidades.
El cuerpo del ejecutivo cíclico quedaría de la siguiente manera.

main()
{
int cont = 0;
while(1) {
if (cont == 30) {
Leer_Entrada_Teclado();
cont = 0;
}
Realizacion_de_Calculos();
cont++;
}
}

Si los cálculos son muy complejos quizás necesites reducir el valor del contador.
También, puedes partir el procedimiento de realizar los cálculos si te interesa.
Un saludo,
Luis.

  Respuesta:  Luis Alfonso
Hola César:
Para hacer lo que tu dices lo mejor es que plantees tu aplicación como un sistema concurrente, que en el caso de un lenguaje como C no es posible implementar estrictamente dado que no es un lenguaje de esas caracteristicas. La solución a tu problema podría plantearse de la siguiente manera. Imagina un bucle infinito en el que se ejecutan entrelazadamente dos procedimientos, uno que realiza los cálculos y otro que atiende la entrada por teclado. Es una especie de "ejecutivo cíclico" (Técnica que se utiliza en los sistemas de tiempo real donde no existe un SO multitarea).

Ej:

void Leer_Entrada_Teclado();
void Realizacion_de_Calculos();

main()
{
while(1) {
Leer_Entrada_Teclado();
Realizacion_de_Calculos();
}
}

char cadena[255];

void Leer_Entrada_Teclado()
{
/* Leer caracteres con una funcion como getch() e ir
metiendolos en una cadena y transformarlos
a enteros o reales, según sea el caso */
/* Si se pulsa el caracter de borrado deberás eliminar
un carácter de esta cadena que va guardando los
caracteres */
}

void Realizacion_de_Calculos()
{
/* Realizacion de los cálculos pertinentes a partir
de los valores números obtenidos en la función
Leer_Entrada_Teclado */
}

Para que ambos procedimientos puedan trabajar sobre los mismos datos emplea variables globales. No vas a tener problema de compartición de recursos (variables) dado que se ejecutan en exclusión mutua, es decir, primero uno, luego el otro.
Espero que te sirva de ayuda.
Un saludo,
Luis.