首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi 如何实现建立recoder数据的动态list

2013-07-09 
delphi 怎么实现建立recoder数据的动态list接收到的record数据,想用类似TList的结构存储存储. 因为接收之

delphi 怎么实现建立recoder数据的动态list
接收到的record数据,想用类似TList的结构存储存储. 因为接收之后要处理 处理完要删除,新的数据又要不断的被存储进来,数据是不定长的,而且是这样处理的,新进的record数据放在最后面,要处理的放在最前面。

type
TXXX = record
xxx: integer;
xx: integer;
end;
PXXX = ^TXXX;

var
.....
p: PXXX;
begin
....
New(p);
p.xxx := 10;
p.xx := 20;
AList.Add(p);
end

这样写虽然是动态的但是无法处理不定长 不定时(处理数据的时间不固定)的数据(而且是多线程 要考虑线程安全)

Type
    RecTest = record (packed)
      ID :integer;
       Name :string;
      Descript:string;
    end;

PRecList = ^RecTest
     RecList arrary[0..100] of PRecList

这个定义 是静态的  无法实现 处理完队列前数据删除数据,接受到新数据放在队列后面,所以也不满足我的要求
1.
  type
    PA1 = ^TA1
    TA1 = record
      FA1, FA2: string;
    end;
2.
  type
    PB2 = ^TB2
    TB2 = record
      FB1, FB2: string;
    end;  

List_USERTYPE := TList.Create;     

//释放Tlist的存储的结构体
procedure TFrom_AdvSpreadGrid.FreeRecord(AList: TList);
var
  i: Integer;
begin
  for i := 0 to AList.Count - 1 do
  begin
    if Assigned(AList[i]) then
      2. 如果定义的是基本类型如:integer,char等可以通用释放;3.如果定义的是短字符串类型,string[255]这样也可以释放
      //Dispose(AList[i]);
      // 1.定义的记录类型是复杂类型,包括string时,必须使用对应定义的记录来释放,例如如下:
      Dispose(PUSE_TYPERec(AList[i]));
  end;
end;

增加记录的代码:
1.
  New(MyUSE_TYPERec);
  MyUSE_TYPERec^.F_USE_TYPE_ID := '';
  MyUSE_TYPERec^.F_USE_TYPE_Name := '';
  List_USERTYPE.Add(MyUSE_TYPERec);

  New(MyUSE_TYPERec);
  MyUSE_TYPERec^.F_USE_TYPE_ID := 'U';
  MyUSE_TYPERec^.F_USE_TYPE_Name := '正常编报';
  List_USERTYPE.Add(MyUSE_TYPERec);

  New(MyUSE_TYPERec);
  MyUSE_TYPERec^.F_USE_TYPE_ID := 'S';
  MyUSE_TYPERec^.F_USE_TYPE_Name := '虚拟汇总单位';


  List_USERTYPE.Add(MyUSE_TYPERec);
2.
  New(MyUSE_TYPERec);
  MyUSE_TYPERec^.F_USE_TYPE_ID := 1;
  MyUSE_TYPERec^.F_USE_TYPE_Name := 1;
  List_USERTYPE.Add(MyUSE_TYPERec);

  New(MyUSE_TYPERec);
  MyUSE_TYPERec^.F_USE_TYPE_ID := 2;
  MyUSE_TYPERec^.F_USE_TYPE_Name := 2;
  List_USERTYPE.Add(MyUSE_TYPERec);

//


这样定义 如果是单线程的话 应该是安全的 但是如果是多线程的 不知道是否 安全  而且看起来定义和数据赋值都很麻烦。
据说 2010之后的delphi 支持泛型的list。
但是我也不知道 这个list是否 满足我的要求

即 list 存储的是 record 的数据 不是指针 存储是动态的 不是静态的
要在多线程下 是安全的。
希望 有过delphi编程经验的朋友帮忙看下  先谢谢了 Delphi 多线程 支持泛型list
[解决办法]
动态添加到List,Add不就是放到最后
为了通用,你的record中最好别有stirng类型,改用array of char 或 string[]
[解决办法]
用你的第1种方法,不过改两点
1.每个record插入一个标识filed,放在第一个,标明这个record的类型
例如
type
  TRecBase = record
    recType : integer;
  end
  PRecBase = ^TRecBase;

  TRec1 = record
    recType : integer;  
    a : string;
    b : boolean;
  end

const
  RecType_1 = 1;

初始化时,先赋值RecType
var rc : TRec1;
new(rc); rc.recType := RecType_1;

访问时,先强制转换成TRecBase并访问recType判断是哪个结构,再根据结构体不同进行不同的操作
p : pointer;
p := lst[0];
case PRecBase(p)^.RecType of 
  RecType_1 : showmessage(TRec1(p)^.a);
end;

2.用TThreadList解决线程同步问题


[解决办法]
如果不需要随机访问节点,建议使用链表结构,理由有二:
1:特处理的节点在首部,处理完成后删除,如果是顺序存储,这一操作需要移动所有数据。
2:链表的增删节点操作只影响自己和其前驱节点(双向链表还影响其后继节点),与其它节点不相干,更有利于并发。

数据不定长没有关系,关键是你要了解数据的组织,要知道不定长的部分是什么,是字符串还是数组……如果数据结构可能有多种,可以用标志变量加case结构的方法来定义record,但我更建议使用class代替record,这时你可以定义多个派生类。


[解决办法]
有关记录和泛型,注意哟

http://bbs.csdn.net/topics/390397634
[解决办法]
不是很明白楼主的意思,是要建一个线程安全的队列吗?如果没有用到 dll 处理数据,下面就可以

Type
  TRecTest = record (packed)
    ID :integer;
    Name :string;
    Descript:string;
  end;

RecList: TQueue<TRecTest>;
RecListLock: TRTLCriticalSection;

//创建时
begin
  InitializeCriticalSection(RecListLock);
  RecList:= TQueue<TRecTest>.Create;
end;

// 解析时
begin
  RecList.Clear;
  FreeAndNil(RecList);
  DeleteCriticalSection(RecListLock); 
end;

function PeekRec: TRecTest;
begin
  FillChar(Result, SizeOf(TRecTest), #0);
  Result.ID := -1; //返回值 -1 表示无效
  EnterCriticalSection(RecListLock);
  Result := RecList.Dequeue;
  LeaveCriticalSection(RecListLock);
end;

procedure AppendRec(RecTest: TRecTest)
begin
  EnterCriticalSection(RecListLock);
  RecList.Enqueue(RecTest);
  LeaveCriticalSection(RecListLock);
end;

[解决办法]
D2009 以后是有泛型的。
TList<Record>
很容易哦
http://www.cnblogs.com/del/category/213198.html

热点排行