elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Temas
Páginas: [1]
1  Foros Generales / Dudas Generales / Alguien entiende de threads en c++ metodos de sincronizacion en: 7 Diciembre 2013, 17:08 pm
Hola de nuevo y disculpas por el spam....jejejeje....Les queria pedir por favor que me dieran una idea o un ejemplo sencillo de como usar metodos sincronizados en c++ sean en visual o devc++....tengo un c´digo en java del ejercicico que quiero hacer nada mas que en c++  y creo que me pase en pedir una traduccion pero mi duda va hacia esa parte....aqui les dejo el codigo en java que funciona y adjunto mi codigo en c++ hasta el momento....Solo para que me guien como irme y como hacer los pasos y metodos adecuados para que mi programa funcione ya que si lo pongo por partes no van a aentender ustedes

Mi gran duda es en como usar los metodos synchronized de java a c++.

En conclusión lo que le spido por favor es que me ayuden en los metodos sincronizados ya que es alli donde tengo el problema se los agradeceré mucho!.

CODIGO JAVA:

http://foro.elhacker.net/dudas_generales/me_podrian_ayudar_a_pasar_codigo_java_a_c_por_favor-t404057.0.html


MI CODIGO C++:

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <stdio.h>
#include <pthread.h>
#ifdef _MSC_VER
#pragma comment(lib, "ptrheadVC2.lib")
#endif



using namespace std;

void Wait();
enum TEstadoPista{Aterrizar, Despegar, Vacia};
enum TEstadoAvion{QuiereAterrizar, QuiereDespegar, OtraCosa};

class Pista
{
      public:
             Pista(int id)
             {
                    id = id;
                    estado = TEstadoPista(Vacia);
                    naviones = 0;
             }
             void setEstado(TEstadoPista estado);
             TEstadoPista getEstado(){return estado;}
             void setNaviones(int naviones);
             int getNaviones(){return naviones;}
      private:
              int id;
              TEstadoPista estado;
              int naviones;
};

void Pista::setEstado(TEstadoPista estado)
{
     estado = estado;
}
void Pista::setNaviones(int naviones)
{
     naviones = naviones;
}


class TorreControl
{     public:
          const int MAXAVIONES=10;
          Pista *pistas[2];
          int pistasAviones[MAXAVIONES];
          TEstadoAvion estAviones[MAXAVIONES];
          int esperandoAterrizar;
         
          TorreControl()
          {
          esperandoAterrizar = 0;
             pistas[0] =  new Pista(1);
          pistas[1] =  new Pista(2);
          }
        int *PedirPistaAterrizar(int idAvion)
        {
           pistasAviones[idAvion]=0;
           estAviones[idAvion] = TEstadoAvion::QuiereAterrizar;
           for(int i=0; i<2; i++)
           { 
              if((pistas->getEstado()==TEstadoPista::Vacia) && (estAviones[idAvion]==TEstadoAvion::QuiereAterrizar))
            {
              pistas->setEstado(TEstadoPista::Aterrizar);
              pistas->setNaviones(pistas->getNaviones() + 1);
              estAviones[idAvion] = TEstadoAvion::OtraCosa;
              pistasAviones[idAvion] = i+1;
            }
           }
           if(estAviones[idAvion]==TEstadoAvion::QuiereAterrizar)
           {
              esperandoAterrizar = esperandoAterrizar + 1;
           }
           return pistasAviones[idAvion];
        }

        int TorreControl::PuedeAterrizar(int idAvion)
        {
           while(estAviones[idAvion] == TEstadoAvion::QuiereAterrizar)
           {
              try
              {
                 wait();
              }
              catch(exception ex)
              {
                 cout<<"Interrupción"<<endl;
              }
           }
           return pistasAviones[idAvion];

        }

        int TorreControl::PedirPistaDespegar(int idAvion)
        {
           pistasAviones[idAvion] = 0;
           estAviones[idAvion] = TEstadoAvion::QuiereDespegar;
           if(esperandoAterrizar==0)
           {
              for(int i=0; i<2; i++)
              {
                 //Revisar Aquí.
                 if((pistas->getEstado()==TEstadoPista::Vacia) || (pistas->getEstado()==TEstadoPista::Despegar && pistas->getNaviones() < 3))
                 {
                    pistas->setEstado(TEstadoPista::Despegar);
                    pistas->setNaviones(pistas->getNaviones() + 1);
                    estAviones[idAvion] = TEstadoAvion::OtraCosa;
                    pistasAviones[idAvion] = i + 1;
                 }

              }

           }
           return pistasAviones[idAvion];
        }

        int TorreControl::PuedeDespegar(int idAvion)
        {
           while(estAviones[idAvion]==TEstadoAvion::QuiereDespegar)
           {
              try
              {
                 wait();
                
              }
              catch(exception ex)
              {
                 cout<<"Despegando"<<endl;
              }
           }
        }

        void TorreControl::GestionarEsperas()
        {
           for(int i=0; i<MAXAVIONES; i++)
           {
              if(estAviones==TEstadoAvion::QuiereAterrizar)
              {
                 for(int j=0; j<2; j++)
                 {
                    if((pistas[j]->getEstado()==TEstadoPista::Vacia) && (estAviones==TEstadoAvion::QuiereAterrizar))
                    {
                       pistas[j]->setEstado(TEstadoPista::Despegar);
                       pistas[j]->setNaviones(pistas->getNaviones()+1);
                       estAviones = TEstadoAvion::OtraCosa;
                       pistasAviones=j+1;
                       esperandoAterrizar = esperandoAterrizar - 1;
                       notifyAll();
                      
                    }

                 }

              }
              else if(estAviones==TEstadoAvion::QuiereDespegar && esperandoAterrizar==0)
              {
                 for(int k=0; k<2; k++)
                 {
                    if((pistas[k]->getEstado()== TEstadoPista::Vacia) || (pistas[k]->getEstado()==TEstadoPista::Despegar && pistas[k]->getNaviones()<3) && (estAviones==TEstadoAvion::QuiereDespegar))
                    {
                       pistas->setEstado(TEstadoPista::Despegar);
                       pistas->setNaviones(pistas->getNaviones()+1);
                       estAviones = TEstadoAvion::OtraCosa;
                       pistasAviones = i+1;
                       notifyAll();
                      
                    }

                 }

              }


           }

        }
};

class Avion:
{
};


int main(int argc, char *argv[])
{
   const int MAXAVIONES = 10;

  system("PAUSE");
  return 0;
}

void Wait()
{
    for(int i=0; i<10000; i++)
     {
        for(int j=0; j<100000; j++)
        {       
        }
     }
}
2  Foros Generales / Dudas Generales / Me podrían ayudar a pasar código java a c++ por favor en: 2 Diciembre 2013, 04:06 am
Hola...Soy nuevo y espero estar aca en el foro compartiendo y aprendiendo que es la idea....Tengo un enorme problema....Estoy haciendo un programa usando hilos....Pero a última hora el ingeniero que me da la clase cambio mi proyecto original de java a c++ y la verdad estoy hecho un mar de dudas pues mi nivel de c++ es el basico y no algo tan experto como para implementar hilos!.

Alquien podría ayudarme por favor a convertir este codigo java a c++ para visual studio 2012.

//Clase Main

enum TEstadoPista{Aterrizar, Despegar, Vacia};
enum TEstadoAvion{QuiereAterrizar, QuiereDespegar, OtraCosa}


public class Main
{
   final static int MAXAVIONES = 10;
   public static void main(String args[]){
               Avion avion;
        TorreControl torreControl=new TorreControl();
        List lAviones = new ArrayList(); // Lista donde metemos las aviones

        System.out.println("---- COMIENZAN A SALIR AVIONES");System.out.println();
        for(int i=0; i < MAXAVIONES; i++){
            avion = new Avion(i,torreControl);
            avion.start();
            lAviones.add(avion);
        }
    }
}


//Clase Pista

class Pista{
    private int id;
    private TEstadoPista estado;
    private int naviones;

    public Pista(int id){
        this.id=id;
        this.estado=TEstadoPista.Vacia;
        naviones=0;
    }

    public TEstadoPista getEstado() {
        return estado;
    }

    public void setEstado(TEstadoPista estado) {
        this.estado = estado;
    }

    public int getNaviones() {
        return naviones;
    }

    public void setNaviones(int naviones) {
        this.naviones = naviones;
    }
}

import java.util.logging.Level;
import java.util.logging.Logger;

class TorreControl{
    final int MAXAVIONES = 50;
    Pista pistas[]=new Pista[2];
    int pistasAviones[]=new int[MAXAVIONES];
    TEstadoAvion estAviones[]=new TEstadoAvion[MAXAVIONES];
    int esperandoAterrizar = 0;

    public TorreControl(){
        pistas[0]=new Pista(1);
        pistas[1]=new Pista(2);
    }

    public synchronized int PedirPistaAterrizar(int idAvion){
        pistasAviones[idAvion]=0;
        estAviones[idAvion]=TEstadoAvion.QuiereAterrizar;
        //Miramos las pistas para ver si hay alguna en la que se pueda aterrizar
        for(int i=0; i<2; i++){
            if ((pistas.getEstado() == TEstadoPista.Vacia) && (estAviones[idAvion] == TEstadoAvion.QuiereAterrizar)){
                pistas.setEstado(TEstadoPista.Aterrizar);
                pistas.setNaviones(pistas.getNaviones()+1);
                estAviones[idAvion] = TEstadoAvion.OtraCosa;
                pistasAviones[idAvion]=i+1;
            }
        }
        if (estAviones[idAvion] == TEstadoAvion.QuiereAterrizar) {
            esperandoAterrizar = esperandoAterrizar + 1;
        }
        return pistasAviones[idAvion];
    }

    public synchronized int PuedeAterrizar(int idAvion){
        while(estAviones[idAvion]==TEstadoAvion.QuiereAterrizar){
            try {
                this.wait();
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return pistasAviones[idAvion];
    }

    public synchronized int PedirPistaDespegar(int idAvion){
        pistasAviones[idAvion]=0;
        estAviones[idAvion]=TEstadoAvion.QuiereDespegar;
        // Solo se puede despegar cuando no haya ninguna avion esperando Aterrizar
        if (esperandoAterrizar==0){
            // Miramos las pistas para ver si hay alguna en la que se pueda despegar
            for(int i=0; i<2; i++){
                if (((pistas.getEstado() == TEstadoPista.Vacia) || (pistas.getEstado() == TEstadoPista.Despegar && pistas.getNaviones()<3)) && (estAviones[idAvion] == TEstadoAvion.QuiereDespegar)){
                    pistas.setEstado(TEstadoPista.Despegar);
                    pistas.setNaviones(pistas.getNaviones()+1);
                    estAviones[idAvion] = TEstadoAvion.OtraCosa;
                    pistasAviones[idAvion]=i+1;
                }
            }
        }
        return pistasAviones[idAvion];
    }

    public synchronized int PuedeDespegar(int idAvion){
        while(estAviones[idAvion]==TEstadoAvion.QuiereDespegar){
            try {
                this.wait();
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return pistasAviones[idAvion];
    }

    public synchronized void DejarPista(int idPista){
        // Liberamos de una avión la pista indicada
        pistas[idPista].setNaviones(pistas[idPista].getNaviones() - 1);
        if (pistas[idPista].getNaviones() == 0)
            pistas[idPista].setEstado(TEstadoPista.Vacia);
        GestionarEsperas();
    }

    // Definimos el procedimiento para poder gestionar las aviones que esten esperando
    private void GestionarEsperas(){
        for(int av=0; av<MAXAVIONES; av++){
            if(estAviones[av]==TEstadoAvion.QuiereAterrizar){
                for(int i=0; i<2; i++){
                    if ((pistas.getEstado() == TEstadoPista.Vacia) && (estAviones[av] == TEstadoAvion.QuiereAterrizar)){
                        pistas.setEstado(TEstadoPista.Aterrizar);
                        pistas.setNaviones(pistas.getNaviones()+1);
                        estAviones[av] = TEstadoAvion.OtraCosa;
                        pistasAviones[av]=i+1;
                        esperandoAterrizar = esperandoAterrizar - 1;
                        // Avisamos a los que estan esperando
                        this.notifyAll();
                    }
                }
            }else if(estAviones[av]==TEstadoAvion.QuiereDespegar && esperandoAterrizar == 0){
                for(int i=0; i<2; i++){
                    if (((pistas.getEstado() == TEstadoPista.Vacia) || (pistas.getEstado() == TEstadoPista.Despegar && pistas.getNaviones()<3)) && (estAviones[av] == TEstadoAvion.QuiereDespegar)){
                        pistas.setEstado(TEstadoPista.Despegar);
                        pistas.setNaviones(pistas.getNaviones()+1);
                        estAviones[av] = TEstadoAvion.OtraCosa;
                        pistasAviones[av]=i+1;
                        // Avisamos a los que estan esperando
                        this.notifyAll();
                    }
                }
            }
        }
    }
}


import java.util.logging.Level;
import java.util.logging.Logger;

class Avion extends Thread{
    private int id;
    private int pista;
    private TorreControl control;

    public Avion(int idAvion, TorreControl tc){
        id=idAvion;
        control=tc;
    }

    @Override
    public void run(){

        try {
            // Despegar
            System.out.println("-- El avion " + id + " quiere despegar.");
            pista = control.PedirPistaDespegar(id);
            while (pista == 0) {
                pista = control.PuedeDespegar(id);
            }
            System.out.println("++> El avion " + id + " esta despegando en la pista " + pista);
            sleep(1000); // Tiempo que tarda en despegar
            System.out.println("--> El avion " + id + " ha despegado en la pista " + pista);
            control.DejarPista(pista-1);

            sleep(3000); // Tiempo que esta volando
            // Aterrizar
            System.out.println("-- El avion " + id + " quiere aterrizar.");
            pista = control.PedirPistaAterrizar(id);
            while (pista == 0) {
                pista = control.PuedeAterrizar(id);
            }
            System.out.println("<++ El avion " + id + " esta aterrizando en la pista ");
            sleep(1000); // Tiempo que tarda en aterrizar
            System.out.println("<-- El avion " + id + " ha aterrizado en la pista " + pista);
            control.DejarPista(pista-1);
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}


Les agradecería mucho a cualquiera mi principal problema es en los metodos de sincrinizacion la verdad no se como hacer eso en c++ no me sale!.


Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines