从socket上不停接收数据然后创建线程来处理,做法如下type //先声明TThread类
  TInitThread = class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;
var
 NewThread: TInitThread; //声明线程对象
implementationconstructor TInitThread.Create;
begin
  inherited Create(FALSE); //Createsuspended = false
  FreeOnTermiNate := True;
end;procedure TInitThread.Execute; //重载execute
begin
  Synchronize(DealData);
end;
procedure DealData();
begin
//处理signlist上数据,这里有查数据库,并需要较长时间
end;Procedure TForm1.SocketRecv(); //在这里接收socket的数据
begin
    GLogCS.Enter; //这是线程同步:GLogCS: TCriticalSection;
    signlist.Add(recvstr);//把收到的数据先添加到一个string数组上
    GLogCS.Leave;
    NewThread := TInitThread.Create; //创建新线程
end;我的问题是:
1、我的这种做发有问题吗?
2、在接收数据时,数据量很大,不停有数据进来,那我就不停的:
   NewThread := TInitThread.Create;
   这样总好象处理不过来,因为数据量小我发现程序没问题,量一大就不对劲了,form
   反应变得很慢,而且form都拖不动了,程序变的很慢

解决方案 »

  1.   

    这样写没有问题如果SocketRecv();里面可不必要线程处理, 最好不用线程在创建与释放会用多一些资源的  
      

  2.   

    Synchronize(DealData);
    这行代码的意思是: 我需要在主线程中运行DealData函数. 并且Synchronize的一个重要的工作是在一个全局变量中插入了dealdata的运行地址. 主线程在收到wm_null消息的时候来查看该全局变量是否有要执行的函数,有就执行. 同时线程在运行这行代码时就已经挂起来了.而好的做法是: 单独写一个同步界面的方法,只是将execute方法取得的或是计算出来的结果显示在主界面上.
      

  3.   

    楼主的思路好象有点乱,我的理解是主程序里面只启动一个接受和发送的线程就可以了,为什么老是TInitThread.Create??我用的WinSocket。
      

  4.   

    楼主没有理解 thread 的作用。
    如果你的 DealData 的确需要的主线程中执行, 那thread 就没作用了。
    而且,你的SocketRecv不能保证刚好收到一个完整的数据包。数据量大时,可能收到很多数据,数据包
    可能被分次接受。你直接接受处理是错误的,除非是UDP.事实上,你只需要创建一个线程,将所有接受的数据,送到该线程。
    为了数据同步,在该线程增加接口,AddData(...), 增加数据时锁住你的缓冲区,execute 中处理数据时也要锁住缓冲区。