|
Usuários |
|
88 Usuários Online
|
|
[Artigos]
Threads no Delphi, por onde começar ? – Parte II |
Publicado por rboaro : Quarta, Fevereiro 20, 2013 - 08:41 GMT-3 (607 leituras)
comentar Enviar para um amigo Versão para impressão
|
Dando continuidade à esse estudo introdutório, veremos mais sobre como manipular uma thread. Na primeira parte vimos como criar uma thread e a importância do método Execute(). Vejamos agora outros métodos e propriedades da classe TThread:
- Start(): Basicamente inicia a execução de uma thread, este método é necessário quando criamos uma thread definindo o seu estado inicial como Suspended (suspensa), por exemplo:
oMinhaThread := TMinhaThread.Create(true); //instanciada como suspensa
oMinhaThread.Start();
- Terminate(): Utilizado para parar a execução de uma thread, basicamente este método seta a variável Terminated da thread para true, assim sendo, é necessário realizar o controle desse status na rotina executada na thread, por exemplo:
//Acionando o fim da thread
oMinhaThread.Terminate();
//Realizando o controle de término dentro da thread
procedure TMinhaThread.Execute;
begin
while (not Self.processamentoFinalizado()) do
begin
if Self.Terminated then //verifica se foi solicitado o encerramento da thread
begin
Self.definirProcessamentoFinalizado();
break;
end;
Self.realizarProcessamento();
end;
end; - Suspend(): Este método pausa a execução da thread suspendendo a sua execução. Mas atenção!!! Este método se tornou obsoleto (deprecated) a partir do Delphi XE:
oMinhaThread.Suspend();
- Resume(): Ao contrário do Suspend(), o Resume() retoma a execução de uma thread que foi pausada. Assim como o Suspend() o Resume() também se tornou obsoleto:
oMinhaThread.Resume();
- OnTerminate: O OnTerminate é na realidade uma propriedade do tipo TNotifyEvent. Assim que a thread é encerrada o OnTerminate será executado, tornando possível atribuir um evento para ser executado assim que a thread chegar ao fim. Esse método será executado no contexto da thread principal e não no contexto da thread atual (veja mais sobre multi-thread no próximo post):
procedure TForm1.reportarFimThread(Sender: TObject);
begin
//O Sender é sempre a thread que está sendo finalizada
gravarLog(format('[%s] Fim da Thread de ID: %d',[TimeToStr(now),TThread(Sender).ThreadID]));
end;
//Atribuindo a procedure para o OnTerminate da thread
oMinhaThread := TMinhaThread.Create(true);
oMinhaThread.OnTerminate := reportarFimThread;
- WaitFor(): Este método aguarda a finalização da thread (finalização do método Execute()) e retorna o ReturnValue (um Integer que pode ser definido no método SetReturnValue()) da thread. O uso do WaitFor() é recomendado para liberar a thread da memória com segurança:
oMinhaThread.Terminate();
if not oMinhaThread.Finished then
oMinhaThread.WaitFor();
oMinhaThread.free;
Essas são as mais básicas e também as principais características da classe TThread. Além das características citadas neste post, para quem não leu a primeira parte deste estudo, vale relembrar do Execute() que é o método executado assim que a thread é iniciada e do FreeOnTerminate que, quando setado para true, faz com que a thread seja liberada da memória automaticamente ao chegar no fim da sua execução.
Na próxima parte vamos ver uma pouco sobre como criar blocos protegidos para acessar objetos compartilhados entre threads com uma maior segurança.
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|