예제 #1
0
        public void EliminarParte(bool is_server)
        {
            Particion to_delete = partes[partes.Count - 1];
            Particion new_end   = partes[partes.Count - 2];

            lock (partes)
            {
                lock (new_end)
                {
                    new_end.Fin = to_delete.Fin;
                    new_end.NotifyPropertyChanged("Fin");
                }

                lock (to_delete)
                {
                    to_delete.Fin        = to_delete.Progreso;
                    to_delete.Finalizado = true;
                    to_delete.NotifyPropertyChanged("Fin");
                }

                partes.Remove(to_delete);
            }

            NotifyPropertyChanged("Partes");
        }
예제 #2
0
        public void AgregarParte(bool is_server)
        {
            Int64     menor = Int64.MaxValue;
            Particion aux   = null;

            foreach (Particion part in partes)
            {
                if (part.Progreso < menor)
                {
                    aux   = part;
                    menor = part.Progreso;
                }
            }

            int nuevo_fin = 0;
            int viejo_fin = 0;

            lock (aux)
            {
                int fin      = aux.Fin;
                int progreso = aux.Progreso;

                int mitad = (fin - progreso) / 2;
                viejo_fin = aux.Fin;
                nuevo_fin = aux.Fin - mitad;

                aux.Fin = nuevo_fin;

                aux.NotifyPropertyChanged("Fin");
            }

            lock (partes)
            {
                if (is_server)
                {
                    Particion nueva_parte = new Particion(this, file_stream, nuevo_fin, viejo_fin, partes.Count, listener);
                    partes.Add(nueva_parte); partes.Add(nueva_parte);
                    NotifyPropertyChanged("Partes");

                    new Thread(nueva_parte.IniciarTransferencia).Start();
                }
                else
                {
                    TcpClient cliente     = new TcpClient(Cliente.HOST, Cliente.PORT + 1);
                    Particion nueva_parte = new Particion(this, file_stream, partes.Count, cliente);
                    partes.Add(nueva_parte);
                    NotifyPropertyChanged("Partes");

                    new Thread(nueva_parte.SolicitarTransferencia).Start();
                }
            }
        }