Ver Mensaje Individual
  #6  
Antiguo 10-02-2011
Avatar de eflosten
eflosten eflosten is offline
Miembro
 
Registrado: abr 2010
Posts: 24
Reputación: 0
eflosten Va por buen camino
Lo que me llama la atención es que si pongo este código en el lugar donde creo el hilo, funciona perfectamente:

Código Delphi [-]
// HiloFTP:=THiloFTP.CreateLista(SlVersionesDescargables,lblProgDescarga);// HiloFTP.execute;
 FTP:=TIdFTP.Create(nil);
  FTP.Username := '******';
  FTP.Password := '******';
  FTP.Host := '*********';

  FTP.Connect;
  FTP.List(SlVersionesDescargables,'',false);

Vamos, que es alguna historia dentro del hilo. Voy a poneros el código del TThread completo, a ver si es alguna metedura de pata que no consigo ver en la propia creación del hilo (repito que es el 2º hilo que programo, estoy muy pez aún en ese tema).

Código Delphi [-]
unit unitHiloFTP;
interface
uses IdFTP, IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdExplicitTLSClientServerBase, Variants, Classes, messages, dialogs,StdCtrls, ComCtrls, Sysutils;
 type THiloFtp = class(TThread)
  private
    modo:string;
    Barra:TProgressBar;
    lblProgreso:TLabel;
    procedure FTPWork(ASender: TObject; AWorkMode: TWorkMode;
   AWorkCount: Integer);
    procedure BajarArchivo;
    procedure ListarArchivos;
    procedure InicializarFTP;
  protected
   procedure Sincronizar;
  public
   FTP: TIdFTP;
   listaArchivos:TStringList;
   RutaRemota: String;
   ArchOrigen,ArchDestino: string;
   tamArchivo,Progreso:integer;
      Terminated: boolean;
   constructor CreateDescarga(CarpetaRemota,ArchRemoto,ArchLocal:string;labelProceso:Tlabel;barraProceso: TProgressBar);overload;
   constructor CreateLista(lista: TStringList;carpeta:string;labelProceso:TLabel);overload;
   procedure Execute; override;
end;
implementation
constructor THiloFTP.CreateDescarga(CarpetaRemota,ArchRemoto,ArchLocal:string;labelProceso:Tlabel;barraProceso: TProgressBar);
begin
 inherited Create(False);
  Terminated := false;
 InicializarFTP;
 Barra:=barraProceso;
 RutaRemota:=carpetaRemota;
 ArchOrigen:=ArchRemoto;
 ArchDestino:=ArchLocal;
 lblProgreso:=labelProceso;
 modo:='DESCARGA';
end;
constructor THiloFTP.CreateLista(lista: TStringList;Carpeta: string;labelProceso: Tlabel);
begin
 inherited Create(false);
 Terminated := false;
 InicializarFTP;
 lblProgreso:=labelProceso;
 listaArchivos:= lista;
 RutaRemota:=carpeta;
 modo:='LISTA';
end;
Procedure THiloFTP.InicializarFTP();
begin
 FTP:=TIdFTP.Create(nil);
 FTP.OnWork :=FTPWork;
 FTP.Username := '******';
 FTP.Password := '******';
 FTP.Host := 'ftp.mihost.es';
end;
procedure THiloFTP.Sincronizar();
begin
 Barra.Position := Progreso div 1024;
 if lblProgreso <> nil then lblProgreso.Caption:=intToStr(Progreso div 1024) + ' / '+IntToStr(tamArchivo)+' KB';
end;
procedure THiloFTP.FTPWork(ASender: TObject; AWorkMode: TWorkMode;
 AWorkCount: Integer);
begin
 Progreso:=AWorkCount;
 Synchronize(Sincronizar);
end;
procedure THiloFTP.Execute;
begin
 if modo = 'DESCARGA' then BajarArchivo
 else if modo = 'LISTA' then ListarArchivos;
 Terminated:=true;
 Terminate;
end;
procedure THiloFTP.BajarArchivo;
var FS: TFileStream;
begin
 try
   if lblProgreso <> nil then lblProgreso.caption:='Abriendo archivo local...';
   FS:=TFileStream.Create(archDestino,FmOpenWrite);
   if lblProgreso <> nil then lblProgreso.caption:='Conectando...';
   FTP.Connect;
   FTP.ChangeDir(rutaRemota);
   if lblProgreso <> nil then lblProgreso.caption:='Descargando...';
   tamArchivo:=FTP.Size( ExtractFileName( archOrigen ) ) div 1024;
   FTP.Get( archOrigen, fs, False );
   if lblProgreso <> nil then lblProgreso.caption:='Desconectando...';
   FTP.Disconnect;
   if lblProgreso <> nil then lblProgreso.caption:='Desconectado.';
   fs.free;
  except
   on e: exception do Showmessage( 'No se ha podido descargar el archivo:'+#13#10+e.Message);
  end;
end;
procedure THiloFTP.ListarArchivos;
begin
 try
  listaArchivos.Clear;
  if lblProgreso <> nil then lblProgreso.caption:='Conectando...';
  FTP.Connect;
  if lblProgreso <> nil then lblProgreso.caption:='Conectado';
  //FTP.ChangeDir(rutaRemota);
  if lblProgreso <> nil then lblProgreso.caption:='Buscando archivos';
  FTP.List(ListaArchivos,'',false);
  if lblProgreso <> nil then lblProgreso.caption:='Desconectando...';
  FTP.Disconnect;
  if lblProgreso <> nil then lblProgreso.caption:='Desconectado';
 finally
  if FTP.connected then FTP.Disconnect;
    Terminated := True;
  end;
end;
end.


Edit:

Neftali, el problema no es con la variable en sí, porque puedo acceder a ella desde el hilo sin problemas, e incluso FTP.List sin parámetros tambien me falla.
Edit 2:
He probado a tratarlo directamente sobre un TSTringList local a la función, y me da el mismo error. Me llama la atención que SIEMPRE el access violation es a la misma direccion de memoria: 00000250

Última edición por eflosten fecha: 10-02-2011 a las 18:22:24.
Responder Con Cita