Lo que me llama la atención es que si pongo este código en el lugar donde creo el hilo, funciona perfectamente:
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';
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