delphi多线程的一个问题(100分)

  • 主题发起人 主题发起人 weiky_wws
  • 开始时间 开始时间
W

weiky_wws

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主进程中getmem(pRecord,sizeof(Record)),pRecor是一个变体结构指针
dtlist.add(pRecord),然后再一个自己创建的线程中使用如下代码:
procedure Tmyprocess.execute;
begin
while not suspendeddo
begin
if tlist.count<>0 then
begin
pRecordOut:=tlist.extract(tlist.first));
freemem(pRecordOut,sizeof(RecordOut));
end;
end;
但是运行1个小时左右,会在freemem(pRecordOut,sizeof(RecordOut));处出现异常EInvalidPointer
with message'Invalid Pointer Operation'.
不知是什么原因?是不是多线程有冲突,我用了TCristalSection好像也没用。急!急!急!
 
把加TCristalSection的关键代码贴出来。
 
tList.Delete(0)?
循环里为什么没加上这一句?
 
用TThreadList代替TList, 操作前调用ThreadList.LockList, 调用後调用UnLock
TList不是线程安全的
 
to PearL:后面我也知道tlist不是线程安全的,于是改成
procedure TExecMsg.ExtractFromList;
begin
pGetOneMsg:= MsgList.Extract(MsgList.First);
end;
Synchronize(ExtractFromList);
这样好象就不出现异常EInvalidPointer
with message'Invalid Pointer Operation'.
但观察内存,发现还是一直涨,不知是什么原因,听说dispose后,内存不会马上释放给系统,
那要多久才会释放?
 
TList.Delete(extract也调用的是Delete)并不会减小List的实际大小, list实际占用内存是由Capacity控制的。
为提高效率, Delphi中的list分配控件一般比Items.Count大, 并且delete只是将后面的item移上来并dec(fCount)而已。
而Capacity的值会根据Count的大小自动增大(只会增大, 不会缩小), 因此如果你操作List Add了无数item, 那么占用的内存就会一致增加, 除非clear或者free或者手工设置Capacity的值, 否则这部分内存永远不会返回操作系统
 
[8D]
getmem()与freemem()没有一一对应
 
因为getmem是在主线程中用,freemem是在其他线程中用
 
//Capacity的值会根据Count的大小自动增大
是这样的,不过不是一定要 Clear,直接 alist.Capacity := alist.Count;
即可
这样不具有破坏性:)
 
后退
顶部