Filas
Sim, eu odeio filas. Mas em programação, filas podem facilitar muito a vida, colocando ordem em nossas rotinas.
Haverá situações em que será necessário garantir que o primeiro elemento adicionado a uma lista seja o primeiro a ser tratado. Esta regra é conhecida como FIFO (first in, firs out- primeiro a entrar, primeiro a sair)
Uma das classes do Delphi que permite tratar um conjunto de objetos obedecendo esta regra é a TObjectQueue (fila de objetos), a segunda classe ‘container’ deste tutorial.
A fila anda…
Imagine como seria se 15 pessoas chegassem num carrinho de cachorro quente e fizessem seus pedidos ao mesmo tempo. É pra evitar confusões e manter a ordem que as filas existem. Com a classe TObjectQueue podemos criar uma fila de objetos que aguardarão sua vez de serem manipulados.
Os métodos disponíveis são os mesmos que a classe TObjectStack, sendo diferente apenas o objeto que é tirado da fila : sempre o que está a mais tempo aguardando. Isto significa que falaremos apenas de filas lineares ou sequênciais, pois não se fornece nesta classe método para alterar a ordem de um objeto na fila, a chamada fila por prioridade.
Se desejar priorizar o processamento de alguns objetos, basta colocá-los numa fila diferente, como se faz com os caixas de banco, reservando um para idosos e outros clientes especiais.
Métodos
- PUSH – Coloca objeto na fila.
- PEEK – Retorna o objeto a mais tempo na fila.
- POP – Tira o primeiro objeto da fila.
- COUNT – Conta quantos objetos estão armazenados.
- CLEAR – Limpa a fila, excluindo todos os objetos
Modo de Usar:
- – Crie o objeto TObjectQueue
- – Adicione um objeto usando o método push()
- – Manipule / modifique o objeto usando peek()
- – Retire o objeto da fila usando pop();
- – Destrua a fila usando free();
Certifique-se de destruir os objetos que retirar.
Ao sair da aplicação, remova todos os objetos da fila.
Libere a memória usada pelos objetos armazenados.
Como os métodos são os mesmos, o exemplo anterior pode ser facilmente adaptado para usar o objeto fila. Não esqueça de adicionar a unit que contém as classes : Contnrs.
procedure TForm1.ExemploFila;
var
Pessoa : TPessoa;
Fila : TObjectQueue;
begin
// cria objetos e fila.
Fila := TObjectQueue.Create;
Pessoa := TPessoa.Create;
try
Pessoa.Nome := 'Wanc';
// adiciona objeto pessoa à fila
Fila.Push(pessoa);
// Mostra quantos objetos estão armazenados.
ShowMessage('Pessoas :' +
IntToStr(fila.Count));
// Obtém o objeto pessoa sem tirá-lo.
Pessoa := TPessoa(fila.Peek);
// Mostra propriedade do objeto armazenado.
ShowMessage ('Nome da pessoa '+ pessoa.Nome);
//retira o objeto da pilha (não tira da memória)
Pessoa := TPessoa(fila.Pop);
finally
// Libera memória
Pessoa.Free;
fila.Free;
end;
end;
procedure TForm1.ExemploPilha; var Pessoa : TPessoa; Pilha : TObjectStack; begin // cria objetos e pilha. Pilha := TObjectStack.Create; Pessoa := TPessoa.Create; Pessoa.Nome := 'Wanc'; // adiciona objeto pessoa á pilha Pilha.Push(pessoa); // Mostra quantos objetos estão armazenados. ShowMessage('Pessoas :' + IntToStr(pilha.Count)); // Obtém o objeto pessoa sem tirá-lo da lista. Pessoa := TPessoa(pilha.Peek); // Mostra propriedade do objeto armazenado. ShowMessage ('Nome da pessoa '+ pessoa.Nome); //retira o objeto da pilha (não tira da memória) Pessoa := TPessoa(Pilha.Pop); // Libera memória Pessoa.Free; Pilha.Free; end;
Onde uso isto?
Crie uma fila de objetos sempre que precisar que estes aguardem o processamento em ordem.
Outra situação: quando a aplicação envolver o tratamento de muitas requisições simultâneas a um recurso limitado.
É possível ainda usar filas para separar elementos conforme o tratamento necessário, criando uma fila para entrada, uma para triagem dos dados e outra para o processamento.
Veja o caso de uma aplicação que recebe centenas de requisições e alterações de pedidos, mas tem apenas uma conexão com o banco de dados ou serviço WEB que processa os pedidos. Neste caso seria interessante montar uma rotina que recebesse o pedido e o colocasse na fila. Outra rotina ficaria responsável por tirar o pedido e enviá-lo o servidor apropriado.
Outros usos indicados:
- Tratamento de eventos
- Distribuição de tarefas
- Processamento de arquivos
Experimente usar filas de objetos para solucionar algoritmos complexos. Verá que elas podem melhorar bastante o seu código!
Abraços e até o próximo capítulo!