Ir para conteúdo
Fórum Script Brasil
  • 0

Duvidas Sobre Tlist


Guest Jean Fernandes

Pergunta

Guest Jean Fernandes

Pessoal preciso tirar umas duvidas sobre o uso de listas dinamicas utilizando objeto TList formado por um Tipo Pessoal (Tipo Record). Desde já agradeco

(** Declaracao de Tipo **)

type

P_DataStream = ^T_DataStream;

T_DataStream = record

Tamanho : Integer;

Dados : array[1..256] of Byte;

end;

(** Declaracao das variaveis **)

var

DDE_Lista_Rx : TList;

DDE_Lista_Tx : TList;

(** DDE-001 - Cria as listas dinamicas **)

procedure TFormPrincipal.DDE_Inicia_Listas;

begin

DDE_Lista_Rx := TList.Create;

DDE_Lista_Tx := TList.Create;

end;

(** DDE-002 - Destroi as Listas Dinamicas **)

procedure TFormPrincipal.DDE_Destroi_Listas;

begin

DDE_Lista_Rx.Free;

DDE_Lista_Tx.Free;

end;

(** DDE-003 **)

procedure TFormPrincipal.DDE_InsereMensagemBuffer_Tx(Valor : T_DataStream);

var NovoItem : P_DataStream;

conta : integer;

begin

if Valor.Tamanho > 0 then begin

New(NovoItem);

with NovoItem^ do begin

Tamanho := Valor.Tamanho;

CopyMemory(@Dados[1], @Valor.Dados[1],Valor.Tamanho);

end;

DDE_Lista_Tx.Add(NovoItem);

// Dispose(NovoItem);

end;

end;

(** DDE-004 **)

procedure TFormPrincipal.DDE_InsereMensagemBuffer_Rx(Valor : T_DataStream);

var NovoItem : P_DataStream;

begin

if Valor.Tamanho > 0 then begin

New(NovoItem);

with NovoItem^ do begin

Tamanho := Valor.Tamanho;

CopyMemory(@Dados[1], @Valor.Dados[1],Valor.Tamanho);

end;

DDE_Lista_Rx.Add(NovoItem);

// Dispose(NovoItem);

end;

end;

(*

Duvida 01:

Nos procedures DDE-003 e DDE-04 se utilizar a linha comentada Dispose(NovoItem)

o item não é adicionado nas variaveis TList, porque ?

Duvida 02:

Como NovoItem é uma variavel local, mesmo com a ausencia do Dispose, a memoria

alocada para o mesmo é liberada no fim da rotina automaticamente ?

Duvida 03:

Uma forma de otimizar a rotina DDE-004 por exemplo seria

procedure TFormPrincipal.DDE_InsereMensagemBuffer_Rx(Valor : T_DataStream);

var NovoItem : P_DataStream;

begin

if Valor.Tamanho > 0 then begin

New(NovoItem);

NovoItem^ := Valor;

DDE_Lista_Rx.Add(NovoItem);

end;

end;

É mais eficiente que a anterior ?

Duvida 04:

O campo Dados de T_DataStream tem comprimento constante, entretanto durante

a dinamica do programa, esse buffer não poderia ser otimizado ? Por exemplo

utilizar uma array de tamanho variavel para alocar apenas o que for necessario

para alocacao de cada elemento da lista ?

Grato

Jean Fernandes

(jeanfernandes.eng@globo.com)

Eng Eletronico

*)

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
Guest Fernando Pazin

O dispose vai destruir a memória que o ponteiro está referenciando.... Sim a memória da variável vai ser destruida no final da procedure porque ela é uma variavel local.... mas lembre-se que ela guarda o endereco de uma outra variavel.... ela não guarda aquele seu Record. O seu Record agora está na TList se usar o dispose o Record morre.

Cuidado! Esse seu código causa um Memory Leak! ... voce aloca memória para os seus Records mas não desaloca no final do programa....

Uma sugestão seria antes de Destruir as Listas....sair dando Dispose nos seus itens.

   while DDE_Lista_Rx.Count <> 0 do
   begin 
        dispose(DDE_Lista_Rx[0]);
        DDE_Lista_Rx.Delete(0);
   end;
   DDE_Lista_Rx.Free;

   while DDE_Lista_Tx.Count <> 0 do
   begin 
        dispose(DDE_Lista_Tx[0]);
        DDE_Lista_Tx.Delete(0);
   end;
   DDE_Lista_Tx.Free;

Sim, eu considero que na sua duvida 3 ficou bem melhor como voce escreveu.

Sim, poderia perfeitamente usar arrays dinamicos no seu Record... só vai ter que se preocupar em dar o tamanho necessário para o Array.

Fernando Pazin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...