Executar Thread num intervalo de tempo

16/04/2020

5

boa noite,

tenho essa thread:
TForm1.PrcessaDados;
begin
MyThread := TThread.CreateAnonymousThread(procedure
begin
try
TThread.Synchronize(nil, procedure
begin
pnlInfo.Caption := '';
pnlInfo.Caption := 'Enviando pedidos...';

end);
// aqui executo os meus processos
EnviaPedidos;
if TThread.CheckTerminated then
Exit;

finally
if not TThread.CheckTerminated then
TThread.Synchronize(nil, procedure
begin
pnlInfo.Caption := 'Pedidos enviados com sucesso...';
end);

end;
end);
MyThread.FreeOnTerminate := False;
MyThread.Start;

end;

Tentei colocar um ttimer para executar essa thread a cada 5 minutos mas não da certo;

procedure TfrmPrincipal.Timer1Timer(Sender: TObject);
var
vHora: String;
vTotal: Integer;
vUltimo, vProximo: String;
vProxTime: TTime;

oCont: Integer;

begin
vTotal := SetInterval(intervalo);
inc(vIntervalo);

vHora := TimeToStr(Time);

lblContador.Caption := IntToStr(vIntervalo) + ' / ' + IntToStr(vTotal);
if (vHora < '23:50:00') then

begin
if vIntervalo = vTotal then // vTotal then
begin
Timer1.Enabled:= False;
ProcessaDados;

// aqui mando os dados da procedure
vProxTime := IncMinute(Time, StrToInt(edtHora.Text));
vUltimo := FormatDateTime('dd/mm/yyy', date) + ' - ' + FormatDateTime('hh:mm', Time);
vProximo := FormatDateTime('dd/mm/yyy', date) + ' - ' + FormatDateTime('hh:mm', vProxTime + 20);
SetAtualizacao(vUltimo, vProximo);

vIntervalo := 0;

DM.CSS.Socket.SendText('OPEN');



Timer1.Enabled:= True;
end;

Preciso executar essa TThread a cada 5 minutos, ou com timer ou de outra forma. Alguem pode me ajudar?

Grato.
Responder

Posts

Se a sua thread terminar antes dos 5 minutos até o próximo evento beleza, mas senão terá um problema, pois o timer também é uma thread.

eu não vi você declarar o código da thread dentro do timer? Ou melhor ainda o MyThread.Start; deve estar dentro do timer que é quando sua thread irá executar. a thread pode estar declarada no form principal no create ou show, mas o disparo dela se dará quando executar o timer.

MyThread.FreeOnTerminate := False;

Muito bem, isto está correto. então cada vez que executar o timer sua thread irá executar.

Verifique se é melhor usar TThread.Queue que impedirá de caso sua thread não terminar antes do próximo evento.

Declare um evento OnTerminate() da thread. Quando terminar você pdoerá por ela fazer algumas ações como ligar botão, ligar ou desligar timer, etc...

No onTerminate você pode pegar o status da thread e ver se ocoreu exceção nela. Se durante a execução da thread der exceção a sua thread irá parar e você não saberá porque ela parou. Use OnTerminate para saber disto e até mesmo reiniciar a thread se for o caso.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar