GARANTIR DESCONTO

Fórum Criação de componentes de conexão em runtime em thread #590002

20/12/2017

0

Boa tarde.

Tenho um agendamento de relatórios. O usuário cadastra os relatórios que ele quer agendar e recebe no email, ftp etc...
Resolvi colocar essa rotina em thread, Está funcionando até que bem, mas quando mais de um agendamento é executado no mesmo horário e como crio os componentes de conexão em runtime, está acontecendo de criar componentes com o mesmo nome. Veja a mensagem de erro: A component named dspRelat already exists. Nesse caso o sistema de agendamento tentou criar mais de um provider com o mesmo nome.
Qual a solução para resolver esse problema?
Lojas Sa

Lojas Sa

Responder

Posts

21/12/2017

Luiz Vichiatto

Através de programação paralela.
Há um porém, está disponivel em versões a partir do XE7.

http://www.tireideletra.com.br/?p=84
http://showdelphi.com.br/como-usar-a-biblioteca-de-programacao-paralela-do-delphi/

Para versões anteriores você pode criar um stringlist com os relatórios que precisa e executar em sequencia.

Att
Responder

Gostei + 0

21/12/2017

Lojas Sa

Através de programação paralela.<br />
Há um porém, está disponivel em versões a partir do XE7.<br />
<br />
http://www.tireideletra.com.br/?p=84<br />
http://showdelphi.com.br/como-usar-a-biblioteca-de-programacao-paralela-do-delphi/<br />
<br />
Para versões anteriores você pode criar um stringlist com os relatórios que precisa e executar em sequencia.<br />
<br />
Att
<br />
<br />
Obrigado Luiz. Irei tentar com sua dica.
Responder

Gostei + 0

03/01/2018

Lojas Sa

Boa tarde Luiz. Tentei executar o agendamento para teste fiz da seguinte forma:

var
   tsk: array [0 .. 2] of ITask;
begin
   tsk[0] := TTask.Create(
      procedure begin
         TThread.Queue(nil, procedure begin
            ExecutaAgendamento(Agend,TipoAgend, TipoOri);
         end);
      end);
   tsk[0].Start; // inicia o processamento antes de criar as TTask seguintes
   tsk[2] := TTask.Create(
      procedure
      begin
         ExecutaAgendamento(Agend,TipoAgend, TipoOri);
      end);
   tsk[1] := TTask.create(
      procedure
      begin
         ExecutaAgendamento(Agend,TipoAgend, TipoOri);
      end);
   tsk[2].Start; // inicia o processamento
   tsk[1].Start;
   TTask.WaitforAll(tsk);




ou seja executei o mesmo agendamento três vezes seguidas. Mas o erro executou o mesmo: A component named dspRelat already exists
Responder

Gostei + 0

03/01/2018

Lojas Sa

Boa tarde Luiz. Tentei executar o agendamento para teste fiz da seguinte forma:

var
   tsk: array [0 .. 2] of ITask;
begin
   tsk[0] := TTask.Create(
      procedure begin
         TThread.Queue(nil, procedure begin
            ExecutaAgendamento(Agend,TipoAgend, TipoOri);
         end);
      end);
   tsk[0].Start; // inicia o processamento antes de criar as TTask seguintes
   tsk[2] := TTask.Create(
      procedure
      begin
         ExecutaAgendamento(Agend,TipoAgend, TipoOri);
      end);
   tsk[1] := TTask.create(
      procedure
      begin
         ExecutaAgendamento(Agend,TipoAgend, TipoOri);
      end);
   tsk[2].Start; // inicia o processamento
   tsk[1].Start;
   TTask.WaitforAll(tsk);




ou seja executei o mesmo agendamento três vezes seguidas. Mas o erro executou o mesmo: A component named dspRelat already exists


Em algumas vezes aparece o seguinte erro:
System Error. Code: 5.
Acesso negado
Responder

Gostei + 0

03/01/2018

Lojas Sa

Boa tarde Luiz. Tentei executar o agendamento para teste fiz da seguinte forma:<br />
<br />
<br />
var<br />
   tsk: array [0 .. 2] of ITask;<br />
begin<br />
   tsk[0] := TTask.Create(<br />
      procedure begin<br />
         TThread.Queue(nil, procedure begin<br />
            ExecutaAgendamento(Agend,TipoAgend, TipoOri);<br />
         end);<br />
      end);<br />
   tsk[0].Start; // inicia o processamento antes de criar as TTask seguintes<br />
   tsk[2] := TTask.Create(<br />
      procedure<br />
      begin<br />
         ExecutaAgendamento(Agend,TipoAgend, TipoOri);<br />
      end);<br />
   tsk[1] := TTask.create(<br />
      procedure<br />
      begin<br />
         ExecutaAgendamento(Agend,TipoAgend, TipoOri);<br />
      end);<br />
   tsk[2].Start; // inicia o processamento<br />
   tsk[1].Start;<br />
   TTask.WaitforAll(tsk);<br />
<br />
<br />
<br />
<br />
ou seja executei o mesmo agendamento três vezes seguidas. Mas o erro executou o mesmo: A component named dspRelat already exists
<br />
<br />
Em algumas vezes aparece o seguinte erro: <br />
System Error. Code: 5.<br />
Acesso negado
<br />
<br />
Quando estou utilizando Synchronize, ele trava aplicação, porém não tenho o erro de criação de componentes com o mesmo nome. Talvez minha solução seria deixar os método como "sessão critica" sem que a aplicação trave.
Responder

Gostei + 0

10/01/2018

Emerson Nascimento

Conseguiu resolver o problema?

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar