Guest Jean Fernandes Postado Julho 5, 2004 Denunciar Share Postado Julho 5, 2004 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 *) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Fernando Pazin Postado Julho 6, 2004 Denunciar Share Postado Julho 6, 2004 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
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
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.