Ir para conteúdo
Fórum Script Brasil
  • 0

Get FTP com atualização de Gauge congela a aplicação


Luciano Umbelino

Pergunta

Olá amigos, bom dia, espero e desejo que todos tenham tido um ótimo natal junto com seus familiares.

Bem pouco tempo atrás postei um tópico com o título Colocar o "Gauge na Linha Selecionada de um DBGrid", com o auxílio dos senhores consegui resolver a contento. Segui o mesmo raciocínio para fazer o get FTP com gauge para acompanhar o percentual de downloado do arquivo, sendo que a diferença é que o gauge coloquei fora do dbgrid. O download é feito por uma thread, uso o componente indy 10, a atualização do gauge no evento FTPOnWork. Acontece que quando mando atualizar(incrementar) o Gauge a aplicação congela, mesmo colocando Application.ProcessMessages, neste caso o form não congela mas o restante de aplicação sim. Quando faço o GetFTP sem atualização do gauge, toda aplicação fica liberada.

Segue os códigos dos eventos:

procedure RecebeArquivo.FTPWorkBegin(ASender: TObject;

AWorkMode: TWorkMode; AWorkCountMax: Int64);

begin

if frmLstLogRecepArq <> nil then // <-- frmLstLogRecepArq é o form onde mostro o gauge com o percentual da recepção

begin

frmLstLogRecepArq .pnlMsgRecep.Caption := MsgRecepcao;

frmLstLogRecepArq .pnlMsgRecep.Visible := True;

frmLstLogRecepArq .pnlGauge.Visible := True;

frmLstLogRecepArq .Gauge1.Visible := True;

frmLstLogRecepArq .Gauge1.Progress := 0;

if AWorkCountMax > 0 then

TamanhoArqFTP := Integer(AWorkCountMax);

frmLstLogRecepArq .Gauge1.MaxValue := TamanhoArqFTP;

end;

end;

procedure RecebeArquivo.FTPWork(ASender: TObject;

AWorkMode: TWorkMode; AWorkCount: Int64);

begin

if frmLstLogRecepArq <> nil then

begin

frmLstLogRecepArq .pnlMsgRecep.Caption := MsgRecepcao;

frmLstLogRecepArq .pnlMsgRecep.Visible := True;

frmLstLogRecepArq .pnlMsgRecep.Visible := True;

frmLstLogRecepArq .pnlGauge.Visible := True;

frmLstLogRecepArq .Gauge1.MaxValue := TamanhoArqFTP;

frmLstLogRecepArq .Gauge1.Progress := AWorkCount;

synchronize(frmLstLogRecepArq .Gauge1.Refresh); // <-- Quando faz a atualização do Gauge a aplicação trava

Application.ProcessMessages;

end;

end;

procedure RecebeArquivo.FTPWorkEnd(ASender: TObject;

AWorkMode: TWorkMode);

begin

if frmLstLogRecepArq <> nil then

frmLstLogRecepArq .Gauge1.Progress := frmLstLogRecepArq .Gauge1.MaxValue;

end;

Preciso resolver isso o quanto antes, fazer o GetFTP com o Gauge sem congelar a aplicação, desde já agradeço o auxílio que possam me prestar.

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0
Experimente sem esse comando

synchronize(frmLstLogRecepArq .Gauge1.Refresh); // <-- Quando faz a atualização do Gauge a aplicação trava

abraço

Amigo grato pela sua atenção.

Fiz os seguintes testes:

retirei o synchronize deixando apenas o refresh do gauge frmLstLogRecepArq .Gauge1.Refresh;

Inibi também o refresh //frmLstLogRecepArq .Gauge1.Refresh;

mesmo assim a aplicação continua congelando. Alguma dica em relação ao que possa estar acontecendo?

Grato,

Link para o comentário
Compartilhar em outros sites

  • 0
Experimente sem esse comando

synchronize(frmLstLogRecepArq .Gauge1.Refresh); // <-- Quando faz a atualização do Gauge a aplicação trava

abraço

Amigo grato pela sua atenção.

Fiz os seguintes testes:

retirei o synchronize deixando apenas o refresh do gauge frmLstLogRecepArq .Gauge1.Refresh;

Inibi também o refresh //frmLstLogRecepArq .Gauge1.Refresh;

mesmo assim a aplicação continua congelando. Alguma dica em relação ao que possa estar acontecendo?

Grato,

E ae galera, alguém tem alguma dica, ainda não consegui resolver esse problema. Help!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Com poucas alterações no seu código, acho que vai funcionar

OBS: Mantenha as configurações atuais para o idFTP e joque o conteudo do idPOP3 dentro do ListBox e faça o teste

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdFTP, Gauges;

type
  TForm1 = class(TForm)
    IdFTP1: TIdFTP;
    Button1: TButton;
    ListBox1: TListBox;
    Gauge1: TGauge;
    procedure Button1Click(Sender: TObject);
    procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
   Form1: TForm1;
   bytesToTransfer: integer;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var indice : integer;
begin
   try
      if IdFTP1.Connected then
         IdFTP1.Disconnect;

      IdFTP1.Connect();

      IdFTP1.List(ListBox1.Items,'*.pdf',false);  //  Listar somente arquivos com extensão .pdf

      if ListBox1.Items.Count = 0 then
         Abort;


      for indice:= 0 to ListBox1.Items.Count -1 do
        begin
          try
             ListBox1.Selected[indice] := true;
             bytesToTransfer := IdFTP1.Size(ListBox1.Items.Strings[indice]);
             IdFTP1.Get(ListBox1.Items.Strings[indice],'' + ListBox1.Items.Strings[indice],true);
          except on e:exception do
          showmessage(e.Message);
          end;
        end;

   finally
      IdFTP1.Disconnect;
   end;
end;

procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
   Gauge1.Progress := 0;
   if AWorkCountMax > 0 then
      Gauge1.MaxValue := AWorkCountMax
   else
      Gauge1.MaxValue := bytesToTransfer;
end;


procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
   Gauge1.Progress  := AWorkCount;
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Com poucas alterações no seu código, acho que vai funcionar

OBS: Mantenha as configurações atuais para o idFTP e joque o conteudo do idPOP3 dentro do ListBox e faça o teste

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdFTP, Gauges;

type
  TForm1 = class(TForm)
    IdFTP1: TIdFTP;
    Button1: TButton;
    ListBox1: TListBox;
    Gauge1: TGauge;
    procedure Button1Click(Sender: TObject);
    procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
   Form1: TForm1;
   bytesToTransfer: integer;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var indice : integer;
begin
   try
      if IdFTP1.Connected then
         IdFTP1.Disconnect;

      IdFTP1.Connect();

      IdFTP1.List(ListBox1.Items,'*.pdf',false);  //  Listar somente arquivos com extensão .pdf

      if ListBox1.Items.Count = 0 then
         Abort;


      for indice:= 0 to ListBox1.Items.Count -1 do
        begin
          try
             ListBox1.Selected[indice] := true;
             bytesToTransfer := IdFTP1.Size(ListBox1.Items.Strings[indice]);
             IdFTP1.Get(ListBox1.Items.Strings[indice],'' + ListBox1.Items.Strings[indice],true);
          except on e:exception do
          showmessage(e.Message);
          end;
        end;

   finally
      IdFTP1.Disconnect;
   end;
end;

procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
   Gauge1.Progress := 0;
   if AWorkCountMax > 0 then
      Gauge1.MaxValue := AWorkCountMax
   else
      Gauge1.MaxValue := bytesToTransfer;
end;


procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
   Gauge1.Progress  := AWorkCount;
end;

end.

abraço

Pelo que entendi, você está dizendo para colocar o FTP direto no form, não deixar dentro da thread que hj é responsável por isso e usar o componente visual do indy 10?

Basicamente o que minha thread faz é isso, mas vou experimentar. Agora tenho uma pergunta o form onde listo os arquivos que já foram baixados, não os que ainda restam a baixar pois o usuário não tem nenhuma ação em relação a isso, pois os arquivos são baixados automáticamente sem intervenção do usuário. Esta tela serve apenas como consulta, para que ele veja quais arquivos já estão no disco e saber que existe algum download em andamento. Se eu fechar esta tela de consulta, não vai interromper o download em andamento?

Se a resposta for sim, foi pensando nisso que coloquei o FTP numa thread, separada.

De qualquer forma agradeço pelo auxílio vou experimentar a solução proposta para ver se tenho um bom resultado.

PS. Pude verificar uma coisa interessante a tela onde o gauge é atualizado, propriamente não congela, a aplicação toda congela quando fecho essa tela com o gauge, isso é que é estranho. Na realidade o que eu quero é poder fechar essa tela e quando abrir novamento o gauge continua atualizado com o percentual atual. Consigo fazer isso com o Put sem problema já com o get, vixi, está parecendo até um parto.

Link para o comentário
Compartilhar em outros sites

  • 0
Pelo que entendi, você está dizendo para colocar o FTP direto no form, não deixar dentro da thread que hj é responsável por isso e usar o componente visual do indy 10?
Sim... se o teste funcionar, voce pode implementar o resultado na thread.

Na realidade o que eu quero é poder fechar essa tela e quando abrir novamento o gauge continua atualizado com o percentual atual.

fechar ou minimizar ... se fechar o processamento é interrompido ... se minimizar não

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Pelo que entendi, você está dizendo para colocar o FTP direto no form, não deixar dentro da thread que hj é responsável por isso e usar o componente visual do indy 10?
Sim... se o teste funcionar, voce pode implementar o resultado na thread.

Na realidade o que eu quero é poder fechar essa tela e quando abrir novamento o gauge continua atualizado com o percentual atual.
fechar ou minimizar ... se fechar o processamento é interrompido ... se minimizar não

abraço

Olá Jhonas,

Então amigo, acho que a grande questão mesmo é a atualização do gauge, já que o FTP com a thread funciona corretamente sem o gauge, quando colodo o gauge para funcionar é que trava a aplicação, não a tela que tem o gauge a aplicação quando fecho essa tela. Por ser uma tela de consulta não posso impedir que o usuário a feche, pois pode até acontecer que ele não a abra. O download dos arquivos acontecem de forma transparente para o usuário, quando ele entra na aplicação, independente dele consultar os arquivos que já foram baixados, a aplicação identifica que existem arquivos para download e começa a baixar, quero apenas poder mostrar para o usuário que no momento existe um arquivo sendo baixado, por isso não posso colocar o FTP neste form, por isso coloquei os procedimentos de FTP dentro dessa thread. Isso de colocar um gauge para que o usuário veja que está sendo baixado um determinado arquivo é um plus, que está me dando um bocado de trabalho e um monte de horas de pesquisa, sem contar nas horas de aluguel de amigos de boa vontade, que estão se dispondo a auxiliar, do jeito que você está fazendo. Vou tentar mais um pouco, mas se não conseguir vai sem gauge mesmo, que coisa mais complicada.

Seu auxílio esta valendo amigo, grato.

Link para o comentário
Compartilhar em outros sites

  • 0

Vou dar uma olhada.

Grato,

Olá Jhonas, bom dia,

Dei uma olhada no exemplo que você me mandou, mas infelizmente ainda não é a solução que preciso, pois o o FTP(OnWorkBegin, OnWork e OnWorkEnd) e o Gauge estão no mesmo form e por se tratar de um único form o usuário não o fecha, no meu caso é um fom de consulta, o FTP e os eventos OnWorkBegin, OnWork e OnWorkEnd ficam numa thread, justamente para que a aplicação fique liberada para outras ações. Pois bem, quando quando o FTP inicia começo a incrementar o gauge, a tela onde o gauge está até fica liberada, mas se eu a fechar, congela toda a aplicação, esse é o problema que tenho que resolver. Se eu faço o FTP sem o gauge, a aplicação funciona normalmente, podendo abrir e fechar essa tela de consulta que contem a relação de arquivos baixados.

De qualquer forma agradeço o seu auxílio,

Um abraço,

Link para o comentário
Compartilhar em outros sites

  • 0

Vou dar uma olhada.

Grato,

Olá Jhonas, bom dia,

Dei uma olhada no exemplo que você me mandou, mas infelizmente ainda não é a solução que preciso, pois o o FTP(OnWorkBegin, OnWork e OnWorkEnd) e o Gauge estão no mesmo form e por se tratar de um único form o usuário não o fecha, no meu caso é um fom de consulta, o FTP e os eventos OnWorkBegin, OnWork e OnWorkEnd ficam numa thread, justamente para que a aplicação fique liberada para outras ações. Pois bem, quando quando o FTP inicia começo a incrementar o gauge, a tela onde o gauge está até fica liberada, mas se eu a fechar, congela toda a aplicação, esse é o problema que tenho que resolver. Se eu faço o FTP sem o gauge, a aplicação funciona normalmente, podendo abrir e fechar essa tela de consulta que contem a relação de arquivos baixados.

De qualquer forma agradeço o seu auxílio,

Um abraço,

Bem pessoal, como não consegui nenhuma solução que atendesse ao que eu estava querendo acabei adotando uma "solução alternativa". O FTP está funcionando bem a aplicação estava congelando quando o GET FTP (download) era iniciado e o gauge na tela de consulta mostrava o percentual do arquivo que já estava baixado. Se esta tela era fechada toda a aplicação congelava, então como solução alternativa não permito mais que a tela de consulta seja fechada, enquanto o arquivo estiver sendo baixado. A tela pode ser minimizada, não fechada, dessa maneira a thread que faz o download e incremento do gauge trabalha normalmente sem congelar a aplicação.

Essa foi a "solução alternativa" encontrada, pelo menos até que encontre uma solução melhor e mais elegante.

Amigos agradeço a todos pelo auxílio prestado, ok?!

Um abraço e tenham um novo ano repleto de boas realizações e sucesso.

Vou dar uma olhada.

Grato,

Olá Jhonas, bom dia,

Dei uma olhada no exemplo que você me mandou, mas infelizmente ainda não é a solução que preciso, pois o o FTP(OnWorkBegin, OnWork e OnWorkEnd) e o Gauge estão no mesmo form e por se tratar de um único form o usuário não o fecha, no meu caso é um fom de consulta, o FTP e os eventos OnWorkBegin, OnWork e OnWorkEnd ficam numa thread, justamente para que a aplicação fique liberada para outras ações. Pois bem, quando quando o FTP inicia começo a incrementar o gauge, a tela onde o gauge está até fica liberada, mas se eu a fechar, congela toda a aplicação, esse é o problema que tenho que resolver. Se eu faço o FTP sem o gauge, a aplicação funciona normalmente, podendo abrir e fechar essa tela de consulta que contem a relação de arquivos baixados.

De qualquer forma agradeço o seu auxílio,

Um abraço,

(resolvido)

Bem pessoal, como não consegui nenhuma solução que atendesse ao que eu estava querendo acabei adotando uma "solução alternativa". O FTP está funcionando bem a aplicação estava congelando quando o GET FTP (download) era iniciado e o gauge na tela de consulta mostrava o percentual do arquivo que já estava baixado. Se esta tela era fechada toda a aplicação congelava, então como solução alternativa não permito mais que a tela de consulta seja fechada, enquanto o arquivo estiver sendo baixado. A tela pode ser minimizada, não fechada, dessa maneira a thread que faz o download e incremento do gauge trabalha normalmente sem congelar a aplicação.

Essa foi a "solução alternativa" encontrada, pelo menos até que encontre uma solução melhor e mais elegante.

Amigos agradeço a todos pelo auxílio prestado, ok?!

Um abraço e tenham um novo ano repleto de boas realizações e sucesso.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...