TThread + Zlib

Delphi

01/03/2011

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.


Gabriel Silva

Gabriel Silva

Curtidas 0

Respostas

Gabriel Silva

Gabriel Silva

01/03/2011

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
GOSTEI 0
José

José

01/03/2011

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0
POSTAR