Isse é o tipo de problema que me dá água na boca! Vamos lá.

Seu problema pode ser resolvido com a estrutura de dados FIFO (First In
First Out), também conhecida como FILA (o primeiro que entra é o
primeiro que sai). O Delphi tem uma classe pra lidar com essa estrutura,
se chama TQueue e fica na unit Contnrs.

Nessa estrutura, há dois métodos principais: 

        Push -> para colocar um item no final da fila
        Pop -> para remover o item que está no início da fila

Na implementação em Delphi, os itens são do tipo Pointer. Você pode
criar uma classe para encapsular as informações que recebe via socket.
Se essa classe herdar de TInterfacedObject você nem precisará se
preocupar com a desalocação desses objetos.

O problema com a sua solução:

Arrays dinâmicos precisam ser realocados na memória cada vez que você
aumenta o tamanho dele. Dependendo da quantidade de itens no array e do
quanto cada item ocupa em memória, isso pode ser uma operação cara.
Independente do tamanho que chega o seu array e do quanto ele ocupa em
memória, com certeza a solução usando uma FILA terá um desempenho melhor
(além de ser bem mais elegante).

Espero ter ajudado.

Um abraço,
Dirlei Dionísio
http://MaisQueBomCodigo.blogspot.com



Em Sex, 2010-05-21 às 13:47 +0000, Marcos Abreu Ferreira escreveu:
>   
> Pessoal,
> 
> tenho a seguinte situação: Recebo informações de um sistema via socket
> e essas informações teem que ser processadas na ordem que chegam e não
> podem ser processadas sem que o processamento da anterior termine. 
> 
> Tentei fazer usando o ClientDataSet, onde criei um campo autoincrement
> e outro com a informação a ser processada. Como posso receber umas 200
> linhas de informações por segundo, o ClientDataSet se mostrou lento,
> pois preciso de uma resposta super rápida no processamento.
> 
> Resolvi então trabalhar com array dinâmico, onde a cada vez que recebo
> uma informação, crio um elemento novo no array e salvo a informação
> lá. Tenho uma variável global onde controlo qual foi o último array
> processado e verificando quantos elementos tem o array, processos os
> faltantes. Coloquei um timer varrendo o array de 1 em 1 milisegundo.
> 
> Qual a opinião de vocês quanto a minha solução? Teriam alguma dica
> sobre como melhora-la?


Responder a