VoidByte

Programar é pensar, muito mais que codificar

Arquivos de tags: filas

Pilhas, Filas e Listas (Parte II)

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!

Engenharia de Software

Este blog tem como meta apresentar algumas discussões e opiniões relacionadas a engenharia de software. O blog foi criado pelo professor José Augusto Fabri da Universidade Tecnológica Federal do Paraná em 2008. Espero que vocês aproveitem os textos aqui apresentados.

Roberto Schneiders

A blog about experiences on software development

Meu mundo - Carlos Eduardo

Just another WordPress.com weblog

Delphi, Delphi Prism, Visual Studio, C#, ASP.NET

Para todos aqueles amantes da arte do desenvolvimento de Software.

Anderson Silva

Tecnologia da informação pra quem gosta de TI

reGIFELix

Alimentando o vicio pela informação e conhecimento em Java e Web Design

Diego Garcia

Delphi, Scrum, Arquitetura de Software e um pouco mais...

Ricardo Boaro

Embarcadero MVP

Blog do Fusco

Visões sobre Transformação Digital, Empreendedorismo, Inovação e Tecnologia da Informação

Leandro Cunha facts

Meu mundo virtual

simasware blog

Desenvolvimento e Software Livre