Criação de componentes de conexão em runtime em thread
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?
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
Curtidas 0
Respostas
Luiz Vichiatto
20/12/2017
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
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
GOSTEI 0
Lojas Sa
20/12/2017
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 />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 />
Obrigado Luiz. Irei tentar com sua dica.
GOSTEI 0
Lojas Sa
20/12/2017
Boa tarde Luiz. Tentei executar o agendamento para teste fiz da seguinte forma:
ou seja executei o mesmo agendamento três vezes seguidas. Mas o erro executou o mesmo: A component named dspRelat already exists
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
GOSTEI 0
Lojas Sa
20/12/2017
Boa tarde Luiz. Tentei executar o agendamento para teste fiz da seguinte forma:
ou seja executei o mesmo agendamento três vezes seguidas. Mas o erro executou o mesmo: A component named dspRelat already exists
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
GOSTEI 0
Lojas Sa
20/12/2017
Boa tarde Luiz. Tentei executar o agendamento para teste fiz da seguinte forma:<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 />
<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 />
ou seja executei o mesmo agendamento três vezes seguidas. Mas o erro executou o mesmo: A component named dspRelat already exists
<br />
Em algumas vezes aparece o seguinte erro: <br />
System Error. Code: 5.<br />
Acesso negado
<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.
GOSTEI 0
Emerson Nascimento
20/12/2017
Conseguiu resolver o problema?
GOSTEI 0