Esse artigo faz parte da revista Clube Delphi edição 21. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Threads - Concorrência no Delphi e Kylix

 

A programação multitarefa é um dos aspectos-chave na arquitetura interna da maioria dos sistemas operacionais. Este é um conceito tão importante e básico que é quase impossível não ser estudado nas cadeiras de sistemas operacionais dos cursos de ciências da computação e processamento de dados.

Mas o que é multitarefa? Sabemos que o sistema operacional Windows utiliza este conceito quando gerencia múltiplos aplicativos ao mesmo tempo. Podemos, por exemplo, digitar um documento no Word ao mesmo tempo em que escutamos música em nosso player, navegamos pela Internet, fazemos download de arquivos ou lemos e-mails. O Windows percorre todos estes aplicativos dando um determinado tempo de execução para cada um, de acordo com sua prioridade, simulando assim a multitarefa. A execução simultânea real de dois ou mais aplicativos na verdade só é possível se o computador possuir mais de um processador.

 

Threads e Processos

 

Quando um desses aplicativos está na memória, utilizando recursos do processador, ele também é conhecido como processo. O Windows realiza multiprocessamento quando gerencia vários processos. Um processo na verdade não executa código, ele contém um objeto interno que é responsável pela execução dos códigos. Este objeto interno é chamado de Thread. Cada processo possui pelo menos um Thread, chamado de Thread primário ou principal. Um aplicativo pode fazer multiprocessamento através da manipulação de vários Threads. Uma aplicação Multithread é aquela capaz de realizar multiprocessamento dentro de si própria.

Os processos e Threads no Windows recebem um identificador quando executados (chamados respectivamente de ThreadID – identificador de Thread, e ProcessID – identificador de processo (PID)). Threads e Processos possuem prioridades de execução, como: baixa, normal ou alta, que são utilizadas pelo Windows quando ele precisa fornecer fatias de tempo (chamadas quantums) para os Threads de cada processo que está na memória.

 

Um Exemplo

 

Seguindo os passos abaixo veremos seu aplicativo como um processo no Windows. Note que neste exemplo utilizaremos o Delphi 5, no Windows NT. No Windows 9x/ME alguns aspectos podem funcionar de forma diferente.

 

1)  No Delphi, inicie uma nova aplicação (File|New > Application).

 

2)  Dê o nome de MainFrm ao Form e atribua ao caption o valor “MultiThread Demo”. Salve a unit com o nome de MainForm e o projeto como MultiThreadDemo.

 

3)  Execute a aplicação pressionando F9.

 

4) Abra o gerenciador de tarefas (task manager) do Windows NT pressionando Ctrl+Shift+Esc (Ctrl+Alt+Del no Windows 95). No NT você pode verificar que sua aplicação é um processo, faz uso de memória e CPU, além de possuir uma prioridade que pode ser setada em tempo de execução pelo próprio Windows (clique com o botão direito sobre o processo). Veja a Figura 1. No windows 9x/ME é possível apenas visualizar o nome do processo.

 

Figura 1. Controle de tarefas com o Gerenciador de Tarefas

 

 

Contador

 

         Neste exemplo criaremos uma procedure simples que executará um determinado bloco de código. Nosso objetivo será escrever uma tarefa, algo que utilize os recursos da máquina, memória, processamento, ou seja, faça o programa ficar ocupado. Poderíamos escrever código para acessar um determinado banco de dados, trazer dados de uma tabela, conectar ao modem, tocar alguma música. No entanto, criaremos uma tarefa bem simples: contar até 10. Não utilizaremos ainda o recurso de MultiThread. Vamos primeiro criar o problema para depois resolvê-lo. Continuando:

 

5) Coloque um TLabel e um TButton no Form e no evento OnClick do botão escreva o seguinte trecho de código:

 

procedure TForm1.Button1Click(Sender : Tobject);

var

 cont : byte;

begin

  for cont:=1 to 10 do

  begin

     sleep(1000); //espera 1 segundo

     label1.caption:=inttostr(cont); //isto não funciona

  end;

end;

 

6) Execute a aplicação pressionando F9. Aperte o botão colocado no Form.

 

 

...

Quer ler esse conteúdo completo? Tenha acesso completo