句柄、内存释放问题

lszzcai 2012-11-19 09:58:39
仿照例子做了个多线程,但运行时发现句柄一直再增加,内存也不能释放,严重时存储文件会导致out of system resources! 如何解决呢?

function MyFun(p: Pointer): Integer; stdcall;
begin
BytesToRead:=11;
SI:=SI_Read(devHandle,@bufferIn,BytesToRead,BytesSucceed);
datausb:= BufferIn[2]*10+BufferIn[3]+BufferIn[4]*0.1+BufferIn[5]*0.01+BufferIn[6]*0.001;
datausb_e:=-(BufferIn[8]+BufferIn[9]*0.1+BufferIn[10]*0.01+BufferIn[11]*0.001);
form1.Edit1.Text:=FloatTOStr(datausb);
form1.ListBox2.items.add(FloatTOStr(datausb));
form1.Edit3.Text:=FloatTOStr(datausb_e);
Result := 0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
ID: THandle;
begin
CreateThread(nil, 0, @MyFun, nil, 0, ID);
end;
...全文
431 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lszzcai 2012-11-20
  • 打赏
  • 举报
回复
还是通过定时器创建线程吗?12楼的方法只是解决了在线程中操作主界面的问题吧?这和利用互斥、临界区好像效果差不多吧?不知道我理解的对不对?
看那山瞧那水 2012-11-20
  • 打赏
  • 举报
回复
采集线程就创建一个,采集完不释放。在线程里定时采集数据,然后线程用消息通知主线程(前台界面)
lszzcai 2012-11-20
  • 打赏
  • 举报
回复
采用的USB接口,通过调用API函数将数据放入缓冲区, SI:=SI_Read(devHandle,@bufferIn,BytesToRead,BytesSucceed); 引起问题的主要原因好像就是1楼、5楼所说的,在时钟里创建线程,如果不通过时钟读取数据,还有其他的方法吗?刚接触DELPHI,请指教!
lszzcai 2012-11-20
  • 打赏
  • 举报
回复
现在明白12楼的意思了,看来是我刚开始理解错了,的确是个办法!
xtfnpgy 2012-11-19
  • 打赏
  • 举报
回复
你用什么做数据采集?有可能是数据采集的控件的内存泄漏,比如WB或IDHTTP
lszzcai 2012-11-19
  • 打赏
  • 举报
回复
原来没用用线程,可后来发现采集终端和上位机数据显示不同步,数据都累计在了内存中,后来用上线程好多了,可发现内存不能释放,句柄数量一直涨
Oraclers 2012-11-19
  • 打赏
  • 举报
回复
引用 7 楼 lszzcai 的回复:
我想做一个实时采集,时钟到来时就读一次内存,不用时钟有更好的办法处理吗?
如果只是讀內存,好象不必用線程吧,時間到了直接調用過程或函數就可。
lszzcai 2012-11-19
  • 打赏
  • 举报
回复
我想做一个实时采集,时钟到来时就读一次内存,不用时钟有更好的办法处理吗?
JPEXE 2012-11-19
  • 打赏
  • 举报
回复
“例子”里应该有告诉读者怎么释放线程的吧,如果没有,扔掉这些“例子”吧。 这里有好的例子:http://www.cnblogs.com/del/category/174761.html
chaishunli 2012-11-19
  • 打赏
  • 举报
回复
时钟里不能多次创建线程
feiba7288 2012-11-19
  • 打赏
  • 举报
回复
线程中操作主界面的控件要用Synchronize
nm_wyh 2012-11-19
  • 打赏
  • 举报
回复
二楼说的对,在多线程中不要操作主窗体中的控件。实在要操作,对线程要进行处理,不要同时操作这些控件。比如线程互斥就可以解决了!
xhz8000 2012-11-19
  • 打赏
  • 举报
回复
form1.Edit1.Text:=FloatTOStr(datausb); form1.ListBox2.items.add(FloatTOStr(datausb)); form1.Edit3.Text:=FloatTOStr(datausb_e); 这些都是线程不安全的
hsfzxjy 2012-11-19
  • 打赏
  • 举报
回复
!!每次计时器一到你就创建线程?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧