Fórum Problema na chamada de Thread #460410
07/11/2013
0
Olá pessoal.
Estou com um problema com a utilização de uma Thread, e gostaria de alguma ajuda, se possível.
Possuo no no sistema em que trabalho um formulário que realiza a leitura de um arquivo de texto e conforme o tipo de registro dentro do arquivo eu o importo para um ClientDataSet diferente. O problema é que essa leitura do arquivo toma alguns 5 ou 6 segundos.
Durante esse período entre a seleção do arquivo e o término do processamento o usuário não tem informação sobre o que está ocorrendo, e eu mesmo acho estranho a tela ficar como se estivesse travada, nesse intervalo, existem outras situações no mesmo formulário em que a tela fica "travada".
Bom, eu criei então um formulário de mensagem, com um gif animado simbolizando o processamento e uma mensagem avisando que está sendo realizado o processamento dos dados. Criei uma Thread dentro da qual eu chamo este formulário de mensagem utilizando o método Synchronize:
Criei então uma função para chamar a Thread mostrando a mensagem, segue o corpo da função:
Então finalmente eu uso essa função no momento em que vou carregar o arquivo, segue o momento do uso da função:
O problema é que quando chamo a Thread eu sei que o processamento das linhas subsequentes ocorre imediatamente sem esperar que a mensagem seja exibida. Assim, a mensagem é exibida apenas depois que o processamento do arquivo termina, quando não existe mais nenhuma necessidade que a mesma apareça. Alguém tem alguma ideia de como contornar esse problema e fazer com que o processamento ao código subsequente só seja realizado quando a Thread iniciar o seu processo de exibir a mensagem?
Desde já agradeço a quem puder ajudar.
Estou com um problema com a utilização de uma Thread, e gostaria de alguma ajuda, se possível.
Possuo no no sistema em que trabalho um formulário que realiza a leitura de um arquivo de texto e conforme o tipo de registro dentro do arquivo eu o importo para um ClientDataSet diferente. O problema é que essa leitura do arquivo toma alguns 5 ou 6 segundos.
Durante esse período entre a seleção do arquivo e o término do processamento o usuário não tem informação sobre o que está ocorrendo, e eu mesmo acho estranho a tela ficar como se estivesse travada, nesse intervalo, existem outras situações no mesmo formulário em que a tela fica "travada".
Bom, eu criei então um formulário de mensagem, com um gif animado simbolizando o processamento e uma mensagem avisando que está sendo realizado o processamento dos dados. Criei uma Thread dentro da qual eu chamo este formulário de mensagem utilizando o método Synchronize:
try
Synchronize(ExibirMensagem);
finally
ExitThread(0);
end;
Criei então uma função para chamar a Thread mostrando a mensagem, segue o corpo da função:
ThdAlerta := ThreadAlertaProcessamento.Create(True);
with ThdAlerta do
begin
FreeOnTerminate := True;
Priority := tpNormal;
Resume;
end
Então finalmente eu uso essa função no momento em que vou carregar o arquivo, segue o momento do uso da função:
if CarregarExtrato() then
begin
try
AvisoProcessamento(True); // Chama a thread antes de processar os arquivos.
LerExtrato();
ProcessarParcelas();
finally
AvisoProcessamento(False); //Finaliza a thread com a mensagem.
HideShowPageControl(False);
end;
end
O problema é que quando chamo a Thread eu sei que o processamento das linhas subsequentes ocorre imediatamente sem esperar que a mensagem seja exibida. Assim, a mensagem é exibida apenas depois que o processamento do arquivo termina, quando não existe mais nenhuma necessidade que a mesma apareça. Alguém tem alguma ideia de como contornar esse problema e fazer com que o processamento ao código subsequente só seja realizado quando a Thread iniciar o seu processo de exibir a mensagem?
Desde já agradeço a quem puder ajudar.
Thebluemonkey
Curtir tópico
+ 0
Responder
Posts
07/11/2013
Gustavo Bretas
TheBlueMonkey, tudo bem? Tente colocar um Application.ProcessMessages entre o AvisoProcessamento(True) e o LerExtrato()
Depois nos diga se deu certo!
Depois nos diga se deu certo!
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)