PROCESS/FUNCTION duda

Started by Hola, October 14, 2017, 05:45:59 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hola

Hola a todos, como les va...., estos últimos días he vuelto a programar después de un largo tiempo y me ha venido una duda respecto al tema PROCESS/FUNCTION a ver si pueden ayudarme. Tengo entendido que al llamar a una function, la ejecuciòn de codigo no continua hasta que la function haya terminado.., bueno, la cuestión la planteo bien simple: desde un proceso principal (a) llamo a dos procesos (b y c), los procesos b y c invocan cada uno, una FUNCTION. La pregunta es, al ejecutarse el proceso b cuando fue llamado.., el proceso c se ejecutaría al terminar la function del proceso b o se ejecutarían los dos procesos (b y c) al mismo tiempo reproduciendo su respectiva function?


Por si eso fue mucha ensalada aqui pongo un poco de codigo:



PROCESS a()
BEGIN
b(); //antes de ejecutar el proceso c, tiene que termina la function de èste proceso?
c();
loop
frame;
END
END


PROCESS b()
BEGIN
prueba();
loop
frame;
end
end



PROCESS c()
BEGIN
prueba();
loop
frame;
end
end


FUNCTION prueba()
BEGIN
//bla bla bla codigo de la funcion
END



Ok, espero que se haya comprendido..., gracias de antemano y salu2...

l1nk3rn3l


Puedes usar el modulo  mod_say para saber desde consola que esta pasando dentro...





import "mod_say"

PROCESS a()
BEGIN
say("se ejecuto process A ");
b(); //antes de ejecutar el proceso c, tiene que termina la function de èste proceso?
c();
prueba("A");
loop
frame;
END
END


PROCESS b()
BEGIN
say("se ejecuto process b ");
prueba("B");
loop
frame;
end
end



PROCESS c()
BEGIN
say("se ejecuto process c ");
prueba("C");
loop
frame;
end
end


FUNCTION prueba(string letra)
BEGIN
//bla bla bla codigo de la funcion
say("se ejecuto funcion prueba desde "+letra);
END


begin
  a();
end




Se imprime en consola esto :

se ejecuto process A
se ejecuto process b
se ejecuto funcion prueba desde B
se ejecuto process c
se ejecuto funcion prueba desde C
se ejecuto funcion prueba desde A



Hola

Buenas l1nk3rn3l, agradezco la respuesta, uhm.., entiendo lo que dices. Para ser mas preciso en lo que quiero saber..., supongamos que la function prueba que ejecuta el proceso b tiene un bucle infinito..., ¿el proceso c se ejecutaría igual y tambien su respectiva function?

SplinterGU

a ver... si la funcion tiene frame pasa al siguiente proceso (sea cual sea este).
function solo detiene al proceso/funcion invocador, si no hay frame dentro de la funcion, esta detiene todo hasta que termine de ejecutarse.
si hay frame en la funcion, solo detiene al invocador y no a los demas.

igualmente siempre se ejecuta 1 proceso por vez, nunca se ejecutan mas de 1 por vez.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

Hola, ahora si eso aclara mi duda, gracias.., aprovecho para preguntar otra cosa respecto a un proceso. Um, si yo tengo un proceso sin bucle., éste proceso ejecutaría su código interno y después se eliminaría solo, es así o hay que meterle un signal? lo mismo seria si tuviera un solo bucle y detengo ese bucle? se elimina el process..

panreyes

Hola "Hola" xD
El proceso finaliza cuando llega al End, no hace falta utilizar signal para acabar con él.
Si no tiene un bucle, el código que esté dentro se ejecutará una sola vez por cada vez que lo instancies.

Ejemplos:
Si tenemos este código:
Process uno();
Begin
graph=png_load("nave.png");
End


Se cargará el gráfico de la nave en este proceso e instantáneamente el proceso dejará de existir y no llegará a mostrar imagen alguna.

Si tenemos este otro código:
Process uno();
Begin
graph=png_load("nave.png");
frame;
End

Se cargará el gráfico de la nave, se mostrará el gráfico por pantalla durante un solo fotograma y finalizará el proceso.

Y si tenemos este otro:
Process uno();
Begin
graph=png_load("nave.png");
while(not key(_esc))
  frame;
end
End

Se cargará el gráfico de la nave y, hasta que pulsemos la tecla ESC, se mostrará el gráfico en cada fotograma.

Espero haberte respondido y explicado un poco mejor cómo funciona.

Hola

#6
Gracias panreyes ahora entiendo..., solo me queda la última pregunta respecto al mismo tema de process. la pregunta es: un process sin frame, detiene todo (al igual que una function) hasta que termine de ejecutarse?

panreyes

Quote from: Hola on October 15, 2017, 05:19:34 PM
Gracias panreyes ahora entiendo..., solo me queda la última pregunta respecto al mismo tema de process. la pregunta es: un process sin frame, detiene todo (al igual que una function) hasta que termine de ejecutarse?
Sí :)

El código de los PROCESS se ejecuta hasta que llega a un "frame".

Un ejemplo:

Begin
uno();
dos();
while(!key(_esc))
  say(4);
  frame;
end
End

Process uno();
Begin
say(1);
frame;
say(3);
End

Process dos();
Begin
say(2);
frame;
End


Este sería su resultado:1
2
4
3
4
4
4
4
4
...


BennuGD hará lo siguiente:
- Inicializa la instancia de uno(), escribe un 1 en consola y hace "frame"
- Inicializa la instancia de dos(), escribe un 2 en consola y hace "frame"
- El hilo principal (process main()) comprueba si se pulsa la tecla escape, y sino es así, escribe un 4 en consola y hace "frame"
- Todas las instancias de proceso han ejecutado su código y alcanzado un frame, así que se renderiza el fotograma (para diferenciarlo del frame del código) en pantalla.
- El gestor de instancias continua ejecutando el código de las instancias, según el orden de las locales "priority" e "id". (No te preocupes si no entiendes esto aún ;) )
- La instancia del proceso main() continua su ejecución desde su último "frame": comprueba si se pulsa la tecla escape, y sino es así, escribe un 4 en consola y hace "frame".
- La instancia del proceso uno() continua su ejecución desde su último "frame", escribe un 3 en la consola y hace "frame"
- La instancia del proceso dos() continua su ejecución desde su último "frame", alcanza el final (End) del proceso y se destruye su instancia.
- Todas las instancias de proceso han ejecutado su código y alcanzado un frame, así que se renderiza el fotograma en pantalla.
- La instancia del proceso main() continua su ejecución desde su último "frame": comprueba si se pulsa la tecla escape, y sino es así, escribe un 4 en consola y hace "frame".
- La instancia del proceso uno() continua su ejecución desde su último "frame", alcanza el final (End) del proceso y se destruye su instancia.
- Todas las instancias de proceso han ejecutado su código y alcanzado un frame, así que se renderiza el fotograma en pantalla.
- La instancia del proceso main() continua su ejecución desde su último "frame": comprueba si se pulsa la tecla escape, y sino es así, escribe un 4 en consola y hace "frame".
- Todas las instancias de proceso han ejecutado su código y alcanzado un frame, así que se renderiza el fotograma en pantalla.
- ...
(y así hasta que se pulse la tecla ESC)

El frame indica que la instancia está lista para mostrarse por pantalla, y cuando todas las instancias han llegado a un frame o han sido destruidas, es cuando se renderiza y se muestra el fotograma por pantalla. A su vez, el frame también devuelve el hilo de ejecución al proceso padre que lo acaba de instanciar (por eso el resultado es 1 (uno),2 (dos),4 (main),3(uno),4(main),4(main),4(main),4(main),4(main),etc...)

No se si te he ayudado con esta explicación o te he confundido más :)

Hola

Perfectamente panreyes, si, ya me ha quedado claro con esos ejemplos, gracias a todos.


Salu2!

SplinterGU

esto esta para ir a un FAQ...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2