procedure Tfrmxx.UServerUDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
  ABinding: TIdSocketHandle);
begin
  if xxx then
  begin
    ..      //(这里是收到某些命令后程序做的一些工作,其中包括一些界面交互的工作)
    ..      //不知道是否用自定义消息,在消息处理里面做,会不会好
    ..
    ..
  end;
end;
问题源自发现程序容易死掉,怀疑是上面的问题

解决方案 »

  1.   

    是的,特别是频繁接收到信息时容易死掉,我感觉是处理adata的问题(当前一个没处理完的时候又来一个信息这时候主线程无法处理导致),用线程应该可以。procedure Tfrmxx.UServerUDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
      ABinding: TIdSocketHandle);
    begin
      if xxx then
      begin
       {这里创建一个新的线程,然后把需要的数据保存到线程中,并把线程保存到TThreadList对象,用Timer定时器定时处理TThreadList即可}
      end;
    end;
      

  2.   

    没必要开线程吧,自定义个消息,[
    code=Delphi(Pascal)]
      if xxx then
      begin
        PostMessage(,xx,Integer(P1),Integer(P2));  //P1,P2为UDP监听的数据,
      end;在消息处理函数里,再做界面交互的事情,这样应该不会存在上面说的问题了吧,呵呵,言错恳请大伙指教![/code]
      

  3.   

    code=Delphi(Pascal)]
      if xxx then
      begin
      PostMessage(,xx,Integer(@P1),Integer(@P2)); //P1,P2可以为UDP监听的数据结构,
      end;
      

  4.   

    应该先把收到的包放进一个自定义的数据队列比如MessageQueue,因为如果传送比较大的数据,就涉及到拆分包和组装包的问题,刚好也可以用这个数据队列处理。然后用线程从数据队列取数据来处理。
    如果传输的数据量不大,只是命令接收信息的机器执行任务,那用楼上所说的消息就可以。
      

  5.   

    Indy的UDP 的是在一个线程里跑的 不象INDY的TCP每次新连接就会开一个线程
    如果UDP的客户端比较多的话,还是另外开一个数据处理线程比较好,UServerUDPRead只管接收数据,往数据处理线程里加数据,数据处理线程负责把数据处理和发送给界面