Bueno, tengo un códgio que expongo a continuación. Los controles son espacio para ir creando varios procesos e intro para arrancarlos. La idea es que arranquen todos a la vez y por turnos vayan creando una gráfica (diagrama de gant si alguien la conoce) pero el caso es que se descuadran a veces un pixel y eso proboca un arrastre de error en el resto de momentos. Normalmente funciona bien el primero, se para en 41 y otra vez en 56, pero a partir de ahí lleva un punto de error y no se a que se debe.
Muchas gracias a los que lo prueben. No necesita nada, solo compilarlo y listo. Tambien hay otro error, pero para ello hace falta tener en la misma carpeta un archivo llamado raton.png que sea un puntero de raton. Si modificais algún valor haciendo click en el mas o el menos, a veces la gráfica no termina nunca. un saludo.
[code language="bennu"]
#define ancho 640
#define alto 480
#define amarillo rgb(100,100,158)
#define rojo rgb(200,10,10)
#define BLANCO rgb(255,255,255)
#define MORADO rgb(200,50,200)
#define VERDIN rgb(10,200,100)
#define separador draw_line(350,38,600,38)
import "mod_mouse";
import "mod_rand";
import "mod_text";
import "mod_proc";
import "mod_grproc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_math";
import "mod_screen";
import "mod_video";
import "mod_time";
import "mod_timers";
import "mod_wm.dll";
declare process proceso(int instant_bloq,int time_ej,int time_bloq,char bloq,int posicion)
public
int pos,ejec,t_ej,t_bloq,inst_bloq;
proceso delante;
proceso detras;
proceso escaneo;
end
end
local
int i;
global
int procesos,empezar,inst_b,t_b,marca=0;
proceso ultimo;
int proporcion=2;
int base_grafica;ancho_p;alto_p;
begin
SET_TITLE("Diagramas De Gant");
GET_DESKTOP_SIZE(&ancho_p,&alto_p);
MOVE_WINDOW(ancho_p/4,alto_p/4);
set_mode(ANCHO,ALTO,16);
mouse.graph=load_png("raton.png");
center_set (0,mouse.graph,0,0);
escribe_pantalla();
loop
if(key(_space))
if(!get_id(type proceso))clear_screen();delete_draw(0);delete_text(0);procesos=0;escribe_pantalla();end
inst_b=rand(0,50); if(inst_b>0)t_b=rand(10,60);else t_b=0;end
ultimo=proceso(inst_b,rand(50,100),t_b,'n',procesos);procesos++;
if(!get_id(type grafica))grafica();end
while(key(_space))frame;end
end
while(key(_enter))empezar=1;timer=0;frame;end
empezar=0;
if(key(_esc))exit();end
frame;
end
end
/******************************************************************************************************************
*********************************PROCESO DEL PROCESO REDUnDO*********************************************************
*******************************************************************************************************************/
process proceso(int instant_bloq,int time_ej,int time_bloq, char bloq,int posicion)
private
int textos[3];
int instante;
begin
x=50;
y=100+procesos*12;
z=100;
pos=posicion;
t_ej=time_ej;
t_bloq=time_bloq;
inst_bloq=instant_bloq;
/*----tabla de valores------------------------------------------------------------*/
write(0,350,45+pos*12,4,pos);
textos[0]=write_var(0,390,45+pos*12,4,t_ej); boton(1,410,45+pos*12);boton(2,420,45+pos*12);
textos[1]=write_var(0,460,45+pos*12,4,inst_bloq); boton(5,480,45+pos*12);boton(6,490,45+pos*12);
textos[2]=write_var(0,545,45+pos*12,4,t_bloq); boton(3,560,45+pos*12);boton(4,570,45+pos*12);
draw_line(350,50+pos*12,600,50+pos*12);
/*--------------------------------------------------------*/
while(empezar==0)
while(escaneo=get_id(type proceso))//hace una búsqueda de todos los procesos
if(escaneo.pos < pos)//y si alguno tiene una posición anterior a la suya (llegó antes)
delante=escaneo; //se pone detrás de él
escaneo.detras=id;end //y le indica a ese proceso que está detras de el
end
if(exists(delante)) x=delante.x; end //si tiene a alguien delante se pone a su altura, así no tenemos que andar
frame;
end
/*if(exists(detras))write_var(0,x-90,y,4,detras.pos);end Esto comentado era para escribir quien tiene delante y
if(exists(delante))write_var(0,x-80,y,4,delante.pos);end* quien tiene detras*/
if(t_ej<=inst_bloq) //como estos ya van a ser los valores definitivos si el t_ej es < al instante_bloq
bloq='x'; //no llegará nunca a bloquearse por lo que todas estas variables no tienen necesidad
inst_bloq=0;
t_bloq=0;
end //Hay que corregir la necedad del usuario
delete_text(textos[0]); //borramos la variable que se actualiza para que no se vaya restando, sino que se pueda ver siempre
delete_text(textos[2]); //borramos la variable que se actualiza para que no se vaya restando, sino que se pueda ver siempre
delete_text(textos[1]);
textos[0]=write(0,390,45+pos*12,4,t_ej); // y la sustituimos por una que no varíe, para poder consultar al final
textos[2]=write(0,545,45+pos*12,4,t_bloq);// y la ponemos en no variable, vamos lo mismo
textos[1]=write(0,460,45+pos*12,4,inst_bloq);
while(t_ej>0) //mientras le quede tiempo de ejecución estará haciendo todo esto
if(!exists(delante)) // si no tiene a nadie delante
ejec=1; //se pone en ejecución
//linea(x,instante);
else
ejec=0;
end
while(ejec==1 and t_ej>0 and (inst_bloq>0 || bloq=='x')) //si tiene el derecho de ejecutarse y le queda tiempo de ejecucion
//y (no se ha llegado al bloqueo o ya no tiene que bloquearse (bloq = x es bloqueo nulo))
inst_bloq--;
t_ej--;
instante++;
drawing_color(amarillo);
from i=1 to proporcion; // por cada unidad dibuja y mueve proporcion
draw_line(x,y,x,y+10);
x++;
end//from
frame;
end
if(inst_bloq<=0 and bloq!='x') //si su instante de bloqueo es menor que 0 y no tiene bloqueo nulo...
linea(x,instante);
bloq='s'; //... debe irse al bloqueo por lo que le ponemos en bloqueo
if(exists(detras))detras.delante=0;end/*como deja de estar el primero para irse al bloqueo, si tiene alguien detrásle indica que ahora es el el primero diciendole que no tiene a nadie delante*/
marca=1; //avisa de que se ponga una marca
end
while(t_bloq>0 and bloq=='s') //si aun le queda tiempo de bloqueo y se encuentra en bloqueo...
instante++;
t_bloq--; //va restandole tiempo de bloqueo
drawing_color(rojo); //esto sirve como referencia para ver cuando está en bloq
from i=1 to proporcion;
draw_line(x,y,x,y+5);//esto sirve como referencia para ver cuando está en bloq
x++; //aunque esté en bloqueo debe seguir avanzando para coordinarse con los demás procesos
end//from
frame;
end
if(t_bloq<=0 and bloq=='s')//si t_bloq<0 y bloq==s quiere decir que acaba de salir del bloqueo
linea(x,instante);
if(exists(ultimo)) //si el fuera el ultimo, ya no habría ningun último posible, por eso es necesario esto
delante=ultimo; //por lo que se coloca el último (pone delante de el al último)
ultimo=id; //y pone su id en donde se guarda la id del último
delante.detras=id;
end
bloq='x'; //ya no se puede bloquear más, por lo que pone el bloqueo en nulo
//
marca=1; //avisa de que se ponga una marca // Aquí dibujamos en el momento en el que sale del bloqueo el tiempo de ej que queda
end
frame;
instante++;
from i=1 to proporcion;
x++;
end //from
end //while de ejec>0
marca=1; //avisa de que se ponga una marca
linea(x,instante);
signal(id,s_kill_tree);
end
/*********************************GRAFICA BLANCA QUE LO MARCA TODO****************/
process grafica()
private
int instante;
begin
x=49;
while(empezar==0)
y=ultimo.y+12;
base_grafica=ultimo.y+12;
frame;
end
drawing_color(BLANCO);
draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo
while(get_id(type proceso))
/* if(marca!=0)
write(0,x,90,4,instante); // Aquí dibujamos en el momento en el que termina de ejecutarse y el tiempo de ej que queda
drawing_color(BLANCO);
draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo
marca=0;
end
instante++;*/
from i=1 to proporcion; // por cada unidad de tiempo lo mueve proporcion veces
put_pixel(x,y,blanco); // por cada unidad de tiempo lo dibuja proporcion veces
x++;
end
frame;
end // bucle madre
/* if(marca!=0)
write(0,x,90,4,instante); // Aquí dibujamos en el momento en el que termina de ejecutarse y el tiempo de ej que queda
drawing_color(BLANCO);
draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo
marca=0;
end*/
end
process linea(x,instante)
begin
z=-2;
y=base_grafica;
write(0,x,90,4,instante); // Aquí dibujamos en el momento en el que termina de ejecutarse y el tiempo de ej que queda
drawing_color(BLANCO);
draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo
end
/*--------------------------------------------------------------------------------------------------------------------
---------------------------------------------BOTONES---------------------------------------------------*/
process boton(int tipo,int x,int y)
private
int mapa;
proceso padre;
begin
graph=new_map(10,10,16);
padre=father;
switch(tipo)
case 1:
map_clear(0,graph,VERDIN);
mapa=write_in_map(0,"+",4);
map_put(0,graph,mapa,5,5);
loop
if(collision(type mouse) && mouse.left && exists(padre))
padre.t_ej++;
end//if
frame;
end//loop
end
case 2:
map_clear(0,graph,MORADO);
mapa=write_in_map(0,"-",4);
map_put(0,graph,mapa,5,5);
loop
if(collision(type mouse) && mouse.left && exists(padre) && padre.t_ej>0)
padre.t_ej--;
end//if
frame;
end//loop
end
case 3:
map_clear(0,graph,VERDIN);
mapa=write_in_map(0,"+",4);
map_put(0,graph,mapa,5,5);
loop
if(collision(type mouse) && mouse.left && exists(padre))
padre.t_bloq++;
end//if
frame;
end//loop
end
case 4:
map_clear(0,graph,MORADO);
mapa=write_in_map(0,"-",4);
map_put(0,graph,mapa,5,5);
loop
if(collision(type mouse) && mouse.left && exists(padre)&& padre.t_bloq>0)
padre.t_bloq--;
end//if
frame;
end//loop
end
case 5:
map_clear(0,graph,VERDIN);
mapa=write_in_map(0,"+",4);
map_put(0,graph,mapa,5,5);
loop
if(collision(type mouse) && mouse.left && exists(padre))
padre.inst_bloq++;
end//if
frame;
end//loop
end
case 6:
map_clear(0,graph,MORADO);
mapa=write_in_map(0,"-",4);
map_put(0,graph,mapa,5,5);
loop
if(collision(type mouse) && mouse.left && exists(padre)&& padre.inst_bloq>0)
padre.inst_bloq--;
end//if
frame;
end//loop
end
end //switch
end //begin
/*********************************ESCRIBE TEXTOS EN PANTALLA*****************************************************************/
process escribe_pantalla();
begin
//DIBUJAMOS LA TABLA DE LOS PROCESOS
write(0,400,30,4,"T. EJ.");
write(0,475,30,4,"INST. BLOQ");
write(0,555,30,4,"T. BLOQ");
write(0,100,20,4,"Procesos creados:");
write_var(0,180,20,4,procesos);
draw_line(350,38,600,38);
end;[/code]
Fixed!
Thanks...