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

(Resolvido) Upload com IDFTP e JvThread


Douglas Soares

Pergunta

Boa tarde, to tento outro problema com IDFtp, to ficando doidão dnv :rolleyes: :blink: :wacko: , me ajudem!!!!

Eu preencho umas linhas no dbgrid, e ativo uma JvThread, no OnExecute da JvThread eu coloco o comando IDFTP.PUT(origem, destino, false); e então no evento OnFinish eu faço um for e tento iniciar a thread novamente com o proximo arquivo a ser enviado!

procedure TfrmPrincipal.threadEnvioFinish(Sender: TObject);
var
i, a : integer;
begin


for i := 0 to cdsUpload.RecordCount - 1 do
begin

if cdsUpload.FieldByName('ESTADO').Value = 1 then
begin
cdsUpload.Edit;
cdsUpload.FieldByName('ESTADO').Value := 2;
cdsUpload.Post;
end;

cdsUpload.Next;
end;

for a := 0 to cdsUpload.RecordCount - 1 do
begin

if cdsUpload.FieldByName('ESTADO').Value = 0 then
begin
cdsUpload.Edit;
cdsUpload.FieldByName('ESTADO').Value := 1;
cdsUpload.Post;
Break;
end;

cdsUpload.Next;
end;

origem := cdsUpload.FieldByName('NOMELOCAL').Text;
destino := cdsUpload.FieldByName('NOMEREMOTO').Text;
threadEnvio.Execute(Self);
end;

Porém quando ele envia o 1º arquivo e vai começar enviar o segundo ele dá erro de ReadTimeOut sendo que eu coloquei a propriedade ReadTimeOut em 30000, mesmo assim o erro me persegue e não consigo enviar mais de um arquivo sem ter que reiniciar a aplicação :(

O que pode estar acontecendo?

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Porém quando ele envia o 1º arquivo e vai começar enviar o segundo ele dá erro de ReadTimeOut

não houve tempo suficiente para finalizar o envio do 1° antes de enviar o proximo ... por isso o erro

voce tem que controlar o tempo de envio ... somente depois disso será possivel o envio do proximo da lista

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Preciso terminar esse negócio hoje até o fim da tarde, já descobri o problema, era o tempo mesmo... só que agora é o seguinte, existe 2 funções para iniciar a thread!

JvThread.Execute(self);

ou

JvThread.ExecuteAndWait(Self);

A segunda opção resolveu meu problema mais criou outro que não consigo resolver...

Se eu uso a 1 opção ele adiciona os itens que selecionei mas da erro de readtimeout, mas se eu uso a segunda opçao, ele adiciona somente um item no dbgrid e envia ele, dps adiciona o outro e envia... e assim por diante, queria que os itens fossem adicionados antes dele começar a enviar... o problema é que eu estou sem mente pra isso, passei a madruga toda no hospital, dormi menos de 2 horas e to exausto, por favor se alguém puder me ajudar resolver isso eu agradeço, se o prazo não fosse pra hoje eu não pediria tal coisa...

segue código da procedure que adiciona itens e envia... (utilizando a opção 2)

Deixei um comentário no código abaixo para identificar a partir de que ponto estou tendo problemas!

procedure TfrmPrincipal.BitBtn10Click(Sender: TObject);
var
instalador, caminhoftp : string;
i, a, b : integer;
cancela : boolean;
enviar : boolean;
ver, curto : string;
begin
enviar := true;
cancela := false;

if ComboBox1.ItemIndex = 0 then
begin
ver := '67';
curto := 'sigi';
end;
if ComboBox1.ItemIndex = 1 then
begin
ver := '67';
curto := 'cell';
end;
if ComboBox1.ItemIndex = 2 then
begin
ver := '47';
curto := 'conv';
end;
if ComboBox1.ItemIndex = 3 then
begin
ver := '47';
curto := 'grupos';
end;

if chkprogramas3.Checked = false then
begin
instalador := 'C:\SN Install\Atualização\' + ComboBox1.Text + '\atualiza_' + curto + ver + '.exe';
caminhoftp := 'downloads/' + LowerCase(ComboBox1.Text) + '/atualiza/atualiza_' + curto + ver + '.exe';

cdsUpload.First;
for i := 0 to cdsUpload.RecordCount do
begin
if cdsUpload.FieldByName('NOMELOCAL').Text = instalador then
begin
cancela := true;
Break;
end;
cancela := false;

cdsUpload.Next;
end;

cdsUpload.First;
for a := 0 to cdsUpload.RecordCount do
begin

if cdsUpload.FieldByName('ESTADO').Value = 1 then
begin
enviar := false;
Break;
end
else
enviar := true;

cdsUpload.Next;
end;

if cancela = false then
begin
cdsUpload.Append;
cdsUpload.FieldByName('NOMELOCAL').Text := instalador;
cdsUpload.FieldByName('NOMEREMOTO').Text := caminhoftp;
cdsUpload.FieldByName('TAMANHO').Text := TamanhoArquivo(instalador);
cdsUpload.FieldByName('VELOCIDADE').Text := '0';
cdsUpload.FieldByName('TEMPORESTANTE').Text := '00:00';
cdsUpload.FieldByName('PROGRESSO').Value := 0;
if enviar then
cdsUpload.FieldByName('ESTADO').Value := 1
else
cdsUpload.FieldByName('ESTADO').Value := 0;

cdsUpload.Post;

if enviar then
begin
origem := instalador;
destino := caminhoftp;

threadEnvio.ExecuteAndWait(Self);
end;

end
else
ShowMessage('Você já está enviando esse instalador');
end
else
begin
// QUANDO TEM MAIS DE UM PROGRAMA!!!!!! MEU PROBLEMA É DAQUI PRA BAIXO
if marcados = programas.Count then
begin

for b := 0 to programas.Count -1 do
begin

if LowerCase(programas[i]) = 'sigi' then
ver := '67';
if LowerCase(programas[i]) = 'sigicell' then
ver := '67';
if LowerCase(programas[i]) = 'sigiconv' then
ver := '47';
if LowerCase(programas[i]) = 'sigigrupos' then
ver := '47';

instalador := 'C:\SN Install\Atualização\' + programas[b] + '\atualiza_' + programascurto[b] + ver + '.exe';
caminhoftp := 'downloads/' + LowerCase(programas[b]) + '/atualiza/atualiza_' + programascurto[b] + ver + '.exe';

cdsUpload.First;
for i := 0 to cdsUpload.RecordCount do
begin
if cdsUpload.FieldByName('NOMELOCAL').Text = instalador then
begin
cancela := true;
Break;
end;
cancela := false;

cdsUpload.Next;
end;

cdsUpload.First;
for a := 0 to cdsUpload.RecordCount do
begin

if cdsUpload.FieldByName('ESTADO').Value = 1 then
begin
enviar := false;
Break;
end
else
enviar := true;

cdsUpload.Next;
end;

if cancela = false then
begin
cdsUpload.Append;
cdsUpload.FieldByName('NOMELOCAL').Text := instalador;
cdsUpload.FieldByName('NOMEREMOTO').Text := caminhoftp;
cdsUpload.FieldByName('TAMANHO').Text := TamanhoArquivo(instalador);
cdsUpload.FieldByName('VELOCIDADE').Text := '0';
cdsUpload.FieldByName('TEMPORESTANTE').Text := '00:00';
cdsUpload.FieldByName('PROGRESSO').Value := 0;
if enviar then
cdsUpload.FieldByName('ESTADO').Value := 1
else
cdsUpload.FieldByName('ESTADO').Value := 0;

cdsUpload.Post;

if enviar then
begin
origem := instalador;
destino := caminhoftp;

threadEnvio.Execute(Self);
end;

end
else
ShowMessage('Você já está enviando esse instalador');

end;
end;
end;
cdsUpload.First;

end;

Obrigado pessoal!

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui resolver essa bagaça... o problema agora é que tenho um gauge dentro de um panel em cada linha do dbgrid... eu gostaria de excluir esses componentes assim que apagar a linha do dbgrid, sempre acontece acess violation :P que saco esse negócio de components em runtime!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Aff Jhonas, nunca + vo te desobedecer, eu apaguei todas essas porcarias de gauges e mandei elas pra rlink32 que o pariu e criei uma fixa grande e vou controlar só nela!!! fora do dbgrid, é chato isso mas é funcional! poxa toda hora esses erros de acess violation blablablá, agora vai dar tudo certinho obrigado pela atenção! vlw!

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...