Fórum TThread + Zlib #396545
01/03/2011
0
Bom,
Primeiramente Obrigado a quem tiver lendo esse tópico por ter se interessado pelo problema.
Estou desenvolvendo um sistema de transferencias de arquivo em "sockets",ambas aplicações servidor/cliente trabalham com Thread,o problema é que após o download do arquivo e ele ser salvo o Delphi insiste em não descomprimir o arquivo sempre resultando no erro ECompression_Error.
Observação:
• Estou usando a função Synchronize para sicronizar a descompressão.
• A Thread trabalha na prioridade tpNormal
•
Abaixo segue o código,agradeço a quem puder dar uma "luz" a esse problema:
unit Unit3;
interface
uses classes,sysutils,wininet,windows, sSkinManager, acPNG, sGauge, sLabel,
ComCtrls, acProgressBar;
type
TArquivoBaixar = class(TThread)
private
FAbrirComo:string;
FSalvarComo:string;
FDownloadStream:TFileStream;
FBarra:TsGauge;
FProgresso:integer;
FMax:integer;
procedure Progresso;
protected
procedure Execute; override;
procedure Descomprime;
public
mirror:string;
externo:string;
SalvarComo:string;
tipo:string;
constructor Create(Barra: TsGauge; Suspenso: boolean);
end;
implementation
uses Unit4, Unit1, Unit2,zlib;
{ TArquivoBaixar }
constructor TArquivoBaixar.Create(Barra: TsGauge; Suspenso: boolean);
begin
FBarra:=Barra;
inherited Create(Suspenso);
end;
procedure TArquivoBaixar.Descomprime;
var
fs:TFileStream;
Descompressor: TDecompressionStream;
Size:integer;
Fim:Byte;
kStream:TFileStream;
begin
try
kStream:=TFileStream.Create(FAbrirComo,fmOpenRead or fmShareExclusive);
Descompressor:= TDecompressionStream.Create(kStream);
Descompressor.Read(Size,sizeof(integer)); // O Erro sempre acontece quando a Stream de Descompressão tenta ler algo
fs:= TFileStream.Create(FSalvarComo,fmCreate or fmShareExclusive);
try
fs.CopyFrom(Descompressor,Size);
finally
Descompressor.Read(Fim, SizeOf(Byte));
fs.Free;
end;
finally
FreeAndNil(Descompressor);
FreeAndNil(kStream);
end;
end;
function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall; external user32 name 'MessageBoxTimeoutA';
procedure TArquivoBaixar.Execute;
var
{ ... }
begin
{ ... }
end;
procedure TArquivoBaixar.Progresso;
begin
FBarra.MaxValue:=FMax;
FBarra.Progress:=FProgresso;
end;
end.
Primeiramente Obrigado a quem tiver lendo esse tópico por ter se interessado pelo problema.
Estou desenvolvendo um sistema de transferencias de arquivo em "sockets",ambas aplicações servidor/cliente trabalham com Thread,o problema é que após o download do arquivo e ele ser salvo o Delphi insiste em não descomprimir o arquivo sempre resultando no erro ECompression_Error.
Observação:
• Estou usando a função Synchronize para sicronizar a descompressão.
• A Thread trabalha na prioridade tpNormal
•
Abaixo segue o código,agradeço a quem puder dar uma "luz" a esse problema:
unit Unit3;
interface
uses classes,sysutils,wininet,windows, sSkinManager, acPNG, sGauge, sLabel,
ComCtrls, acProgressBar;
type
TArquivoBaixar = class(TThread)
private
FAbrirComo:string;
FSalvarComo:string;
FDownloadStream:TFileStream;
FBarra:TsGauge;
FProgresso:integer;
FMax:integer;
procedure Progresso;
protected
procedure Execute; override;
procedure Descomprime;
public
mirror:string;
externo:string;
SalvarComo:string;
tipo:string;
constructor Create(Barra: TsGauge; Suspenso: boolean);
end;
implementation
uses Unit4, Unit1, Unit2,zlib;
{ TArquivoBaixar }
constructor TArquivoBaixar.Create(Barra: TsGauge; Suspenso: boolean);
begin
FBarra:=Barra;
inherited Create(Suspenso);
end;
procedure TArquivoBaixar.Descomprime;
var
fs:TFileStream;
Descompressor: TDecompressionStream;
Size:integer;
Fim:Byte;
kStream:TFileStream;
begin
try
kStream:=TFileStream.Create(FAbrirComo,fmOpenRead or fmShareExclusive);
Descompressor:= TDecompressionStream.Create(kStream);
Descompressor.Read(Size,sizeof(integer)); // O Erro sempre acontece quando a Stream de Descompressão tenta ler algo
fs:= TFileStream.Create(FSalvarComo,fmCreate or fmShareExclusive);
try
fs.CopyFrom(Descompressor,Size);
finally
Descompressor.Read(Fim, SizeOf(Byte));
fs.Free;
end;
finally
FreeAndNil(Descompressor);
FreeAndNil(kStream);
end;
end;
function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall; external user32 name 'MessageBoxTimeoutA';
procedure TArquivoBaixar.Execute;
var
{ ... }
begin
{ ... }
end;
procedure TArquivoBaixar.Progresso;
begin
FBarra.MaxValue:=FMax;
FBarra.Progress:=FProgresso;
end;
end.
Gabriel Silva
Curtir tópico
+ 0
Responder
Posts
01/03/2011
Gabriel Silva
Desculpem pelo post duplicado mais nao achei o botão para editar a 1ª postagem,
Eu tentei usar a mesma função em outra aplicação usando um botão e funciona normalmente,
e aqui segue uma imagem do debugger do Delphi:
http://hiperpic.com/images/89634726825783774159.png
Eu tentei usar a mesma função em outra aplicação usando um botão e funciona normalmente,
e aqui segue uma imagem do debugger do Delphi:
http://hiperpic.com/images/89634726825783774159.png
Responder
Gostei + 0
27/05/2013
José
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)