Pascal/Turbo Pascal - problema, convinar dos procedimientos

 
Vista:

problema, convinar dos procedimientos

Publicado por martin (7 intervenciones) el 05/07/2007 23:40:45
Hola amigos, como estan?

Miren tengo este problema...
Tengo escrito un procedimiento que suma 1 a la variable pos cada 1 seg;

PROCEDURE sumar;
BEGIN
REPEAT
suma := suma + 1;
delay(1000);
UNTIL suma > 50;
END;

Y en el cuerpo principal del programa tengo algo más o menos asi:

BEGIN

sumar;

REPEAT
a := readkey;
suma2 := suma2 + 1;
UNTIL suma2 > 50;

END;

El problema mio es este...
Cuando llamo al procedimiento sumar, el delay corta todo el programa y no me deja leer la tecla que quiero.
Hay alguna forma de que suma 1 a suma cada x tiempo y al mismo tiempo lea la letra?

Gracias,
Adiós.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problema, convinar dos procedimientos

Publicado por M@rceloL (25 intervenciones) el 06/07/2007 01:03:57
Hola, Martín.

Mirá, lo que está pasando es que Delay monopoliza el hilo de ejecución.

Para evitar estas cosas hay que hacer programación multihilo, que es un tema un tanto complicado.

Si querés salir del paso, mirate esta dirección http://pascal.sources.ru/multtask/multi1.htm.

Está bastante bueno, aunque tampoco es para tirar cohetes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema, convinar dos procedimientos

Publicado por Martín (7 intervenciones) el 06/07/2007 02:37:32
Hola,
Primero que nada gracias por sus respuestas.

Mechanic, hacer que el programa te oblige a sumar uno es lo que quiero: quiero que sume uno cada un segundo y además sume uno también cuando tocas una tecla.

Marcelo creo que lo que me dijiste de la programación multihilo es justo lo que estoy buscando, pero el link que me pasaste descargo el archivo y no lo puedo leer con el winZip no sé porque. Busqué en Google y encontre varios tutoriales pero de C/C++, Java, pero ninguno de Pascal, ¿sabrás alguna página donde poder buscar algo para Turbo Pascal 7.0?

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema, convinar dos procedimientos

Publicado por Diego Romero (996 intervenciones) el 06/07/2007 02:45:31
He bajado el archivo que te indicó M@rceloL, lo he podido descomprimir. Está comprimido con una versión de .zip para DOS bastante vieja (la 2.0) pero es perfectamente leíble.

No he analizado el contenido aún pero si quieres te lo paso de la forma que tú me indiques.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:problema, convinar dos procedimientos

Publicado por Mechanic (177 intervenciones) el 06/07/2007 02:05:23
Hola Martin.

Cuando llamas al procedure este suma 1 cada segundo a tu variable
hasta que esta alcanza un valor de 51.

REPEAT
suma := suma + 1;
delay(1000);
UNTIL suma > 50;
END;

Ten en cuenta que para ese entonces habran pasado 51 segundos que tuviste que esperar sin poder hacer absolutamente nada!

Luego tienes

REPEAT
a := readkey;
suma2 := suma2 + 1;
UNTIL suma2 > 50;

Cada vez que el ciclo repite a:= readkey el programa se queda esperando que tú presiones una tecla. Y 51 veces va a esperar que presiones.

Además debes adivinar si ya pasaron los 51 segundos del procedure para emezar a presionar tus 51 veces.

Si lo que quieres es que "suma2" crezca solo si tu decides presionar una tecla(y no que el programa te obligue) es hacer algo como esto

REPEAT
if KeyPressed then a := readkey;
suma2 := suma2 + 1;
UNTIL a = Char(27); O sea cuando presiones ESC para que puedas abortar ja ja.

Espero haberte ayudado en algo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema, convinar dos procedimientos

Publicado por Diego Romero (996 intervenciones) el 06/07/2007 02:41:20
Una corrección: suma no está inicializada a ningún valor así que eso de 51 segundos es relativo.

Es verdad lo que te comentan los dos compañeros foristas. Para lograr lo que quieres necesitas programar en un entorno multitareas. Si estás programando para DOS, DOS no es multitarea (no tiene "hilos de ejecución").

Si nos explicas qué quieres lograr tal vez podamos darte una mano aunque sospecho que estás haciendo algo como un juego.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema, convinar dos procedimientos

Publicado por Martín (7 intervenciones) el 06/07/2007 03:43:31
Sí, es un juego...

Es así:
Vos sos un personaje (un *) y te vas moviendo por la pantalla.
Y hay como unos "bichos" (#) que te persiguen, lo que tenes que hacer es escapar.

Entonces yo escribí un procedimiento para que el # se acerque una posición por segundo hacía donde está el *, hasta que llegue a la posición del *.

El problema es que para marcar el intevalo de movimiento del # use un delay() y mientras está corriendo el procedimiento para acercar el # al *, no puedo leer ninguna tecla y al no poder leer ninguna tecla no puedo mover el *.

Mi código sería más o menos así:

PROCEDURE mover(dir:char);
CASE dir OF
'a' : Personaje.posX := Personaje.posX-1;
's' : Personaje.posY := Personaje.posY+1;
'w' : Personaje.posY := Personaje.posY-1;
'd' : Persoanej.posX := Personaje.posX+1;
END;
END;

PROCEDURE acercar;
BEGIN

WHILE (Bicho.posX < Personaje.posX-1) OR ((Bicho.posX < Personaje.posX) AND (Bicho.posY <> Persoaneje.posY)) DO BEGIN
Bicho.posX := Bicho.posX + 1;
delay(1000);
END;

END;

BEGIN

REPEAT
acercar;
ac := readkey;
mover(ac);
UNTIL mover = char(27);

END.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema, convinar dos procedimientos

Publicado por Martín (7 intervenciones) el 06/07/2007 03:48:08
Me olvide... obviamente hay que declarar las variables e inicializarlas. Y en acercar falta contemplar las posibilidades de que bicho.posX sea mayor a personaje.posX pero puse esa parte para que se entienda más facil, acercarse en dirección Y e X para el otro lado sería lo mismo.

En ese código el bicho se acerca hasta que choca con el personaje y recien ahí me puedo mover, mi idea es que se pueda mover mientras se va acercando.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:problema, convinar dos procedimientos

Publicado por Mechaic (177 intervenciones) el 06/07/2007 21:14:56
Martín
Por qué no pones completo tu code para que podamos analizarlo y encontrar la manera de hacer que funcione como debe porque yo lo copié de aquí y lo pegué para compilarlo pero hay que declarar variables y registros para que funcione.

Si pones tu código aquí yo me comprometo a encontrarle la solución, luego tú decides si lo modificas a tu manera o lo dejas con mis cambios(o los cambios de alguien más). Toltal.. ya sabemos que el juego es tuyo

Se tiene que poder sin usar eso de los 'hilos de ejecución' porque a mi me gusta hacer juegos y no he tenido que usarlos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar