Coordinar varios procesos

Started by Danielo515, December 15, 2008, 04:42:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

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]

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2