Ajuda com Thread
14/02/2020
0
procedure TEasyInnerControllerOnline.MaquinaEstados;
var
index: integer;
InnerAtual: TInner;
begin
// Enquanto a variável de controle da maquina de ESTADOs estiver false..
while (not Parar) do
begin
for index := 0 to ListaInners.Count - 1 do
Begin
InnerAtual := ListaInners.Items[index];
// Realiza Um Switch do ESTADO Atual do Inner..
CASE InnerAtual.EstadoAtual OF
aqui fica fazendo a verificações
end;
Sleep(1);
end;
end;
// Fecha a porta de Comunicação quando sai da maquina de estados..
FecharPortaComunicacao();
end;
E preciso passar para código abaixo para liberar catraca, porém fica parado na rotina acima.
if ibqAssociadoSTATUS.Value = 'ATIVO' then
begin
btnEntrada.OnClick(Self);
end;
Obrigado.
Marcelo Vieira
Posts
14/02/2020
Emerson Nascimento
procedure TEasyInnerControllerOnline.MaquinaEstados; var index: integer; InnerAtual: TInner; begin // Enquanto a variável de controle da maquina de ESTADOs estiver false.. while (not Parar) do begin Application.ProcessMessages; for index := 0 to ListaInners.Count - 1 do begin InnerAtual := ListaInners.Items[index]; // Realiza Um Switch do ESTADO Atual do Inner.. CASE InnerAtual.EstadoAtual OF aqui fica fazendo a verificações end; sleep(1); end; end; // Fecha a porta de Comunicação quando sai da maquina de estados.. FecharPortaComunicacao(); end;
Se ainda assim não resolver o teu problema, é possível, sim (e fácil), passar ao uso de threads.
15/02/2020
Marcelo Vieira
procedure TEasyInnerControllerOnline.MaquinaEstados; var index: integer; InnerAtual: TInner; begin // Enquanto a variável de controle da maquina de ESTADOs estiver false.. while (not Parar) do begin Application.ProcessMessages; for index := 0 to ListaInners.Count - 1 do begin InnerAtual := ListaInners.Items[index]; // Realiza Um Switch do ESTADO Atual do Inner.. CASE InnerAtual.EstadoAtual OF aqui fica fazendo a verificações end; sleep(1); end; end; // Fecha a porta de Comunicação quando sai da maquina de estados.. FecharPortaComunicacao(); end;
Se ainda assim não resolver o teu problema, é possível, sim (e fácil), passar ao uso de threads.
Primeiramente obrigado pela dica Emerson, o Application.ProcessMessages a princípio resolveu nos testes que fiz, mas ainda gera um delay de processamento, vou colocar em produção no micro que está a catraca. De qualquer forma está recebendo o enter através do teclado pelo botão que está como default, o que antes não acontecia.
15/02/2020
Emerson Nascimento
procedure TEasyInnerControllerOnline.MaquinaEstados; var index: integer; InnerAtual: TInner; begin // Enquanto a variável de controle da maquina de ESTADOs estiver false.. while (not Parar) do begin Application.ProcessMessages; // coloquei aqui for index := 0 to ListaInners.Count - 1 do begin Application.ProcessMessages; // e aqui também InnerAtual := ListaInners.Items[index]; // Realiza Um Switch do ESTADO Atual do Inner.. CASE InnerAtual.EstadoAtual OF aqui fica fazendo a verificações end; sleep(1); end; end; // Fecha a porta de Comunicação quando sai da maquina de estados.. FecharPortaComunicacao(); end;
17/02/2020
Marcelo Vieira
procedure TEasyInnerControllerOnline.MaquinaEstados; var index: integer; InnerAtual: TInner; begin // Enquanto a variável de controle da maquina de ESTADOs estiver false.. while (not Parar) do begin Application.ProcessMessages; // coloquei aqui for index := 0 to ListaInners.Count - 1 do begin Application.ProcessMessages; // e aqui também InnerAtual := ListaInners.Items[index]; // Realiza Um Switch do ESTADO Atual do Inner.. CASE InnerAtual.EstadoAtual OF aqui fica fazendo a verificações end; sleep(1); end; end; // Fecha a porta de Comunicação quando sai da maquina de estados.. FecharPortaComunicacao(); end;
Olá Emerson, obrigado pelo apoio, ainda continua com um delay mas acredito que não vai prejudicar o processo, é muito rápido. Vou colocar em produção e acompanhar. Valeu.
17/02/2020
Emerson Nascimento
Mas se não ficar satisfatório, o uso de thread deve ser avaliado. Não é difícil implementar.
Clique aqui para fazer login e interagir na Comunidade :)