仿照例子做了个多线程,但运行时发现句柄一直再增加,内存也不能释放,严重时存储文件会导致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;

解决方案 »

  1.   

    form1.Edit1.Text:=FloatTOStr(datausb);
      form1.ListBox2.items.add(FloatTOStr(datausb));
      form1.Edit3.Text:=FloatTOStr(datausb_e);
    这些都是线程不安全的
      

  2.   

    线程中操作主界面的控件要用Synchronize
      

  3.   

    “例子”里应该有告诉读者怎么释放线程的吧,如果没有,扔掉这些“例子”吧。
    这里有好的例子:http://www.cnblogs.com/del/category/174761.html
      

  4.   

    你用什么做数据采集?有可能是数据采集的控件的内存泄漏,比如WB或IDHTTP
      

  5.   

    采用的USB接口,通过调用API函数将数据放入缓冲区,  
    SI:=SI_Read(devHandle,@bufferIn,BytesToRead,BytesSucceed);引起问题的主要原因好像就是1楼、5楼所说的,在时钟里创建线程,如果不通过时钟读取数据,还有其他的方法吗?刚接触DELPHI,请指教!