delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
我用IndyTcpServer的时候,收到信息写到界面的时候报异常,请问怎么回事 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061123075059276.html
收到信息代码如下:  
  procedure   TForm1.ServerExecuteNew(AThread:   TIdPeerThread);  
  var  
      ActClient,   RecClient:   PClient;  
      SMSPackage:   TSMSPackage;  
      RecThread:   TIdPeerThread;  
  //     mobile1,msg1:string;  
      i,size:   Integer;  
      ms:TMemoryStream;  
      fn:string;  
      mo,ms1:string;  
  begin  
      memo1.Lines.Add('--------------------------------------------------');  
      memo1.Lines.Add('                                                                               ');  
      memo1.Lines.Add('ServerExecuteNew');  
      if   not   AThread.Terminated   and   AThread.Connection.Connected   then  
      begin  
          ms   :=   TMemoryStream.Create;  
          AThread.Connection.ReadBuffer   (SMSPackage,   SizeOf   (TSMSPackage));  
          ActClient   :=   PClient(AThread.Data);  
          ActClient.LastAction   :=   Now;     //   update   the   time   of   last   action  
   
          ms.WriteBuffer(SMSPackage,sizeof(TSMSPackage));  
          fn   :=   formatDateTime('hhmmsszzz',now);  
          fn   :=   'c:\package\'+fn;  
          ms.SaveToFile(fn);  
          ms.Free;  
   
   
          size   :=   SMSPackage.pkMobileLen;  
          setlength(mo,size);  
          AThread.Connection.ReadBuffer   (mo,   size);  
          size   :=   SMSPackage.pkMsgLen;  
          setLength(ms1,size);  
          AThread.Connection.ReadBuffer   (ms1,   size);  
   
  self.memo1.lines.add(mo);  
  self.memo1.lines.add(ms1);  
   
      end;  
  end;  
   
  在self.memo1.lines.add(mo)的时候报内存访问异常,请问怎么回事  
  是不是在一个ServerExecut不能多次readbuffer呢

曾经做过一些类似的,但是现在想不起来了。  
   
  建议你去看看Delphi6网络编程这个本书。

ms   :=   TMemoryStream.Create;  
          AThread.Connection.ReadBuffer   (SMSPackage,   SizeOf   (TSMSPackage));  
          ActClient   :=   PClient(AThread.Data);  
          ActClient.LastAction   :=   Now;     //   update   the   time   of   last   action  
   
          ms.WriteBuffer(SMSPackage,sizeof(TSMSPackage));  
          fn   :=   formatDateTime('hhmmsszzz',now);  
          fn   :=   'c:\package\'+fn;  
          ms.SaveToFile(fn);  
          ms.Free;  
   
  这段的MS创建和释放我觉得还是加个异常比较保险    
   
  一个ServerExecut能不能多次readbuffer呢?  
   
  答案是可以的,这个应该没问题  
   
 

ms   :=   TMemoryStream.Create;  
          AThread.Connection.ReadBuffer   (SMSPackage,   SizeOf   (TSMSPackage));  
          ActClient   :=   PClient(AThread.Data);  
          ActClient.LastAction   :=   Now;     //   update   the   time   of   last   action  
   
          ms.WriteBuffer(SMSPackage,sizeof(TSMSPackage));  
          fn   :=   formatDateTime('hhmmsszzz',now);  
          fn   :=   'c:\package\'+fn;  
          ms.SaveToFile(fn);  
          ms.Free;  
   
  MS只是一段调试信息,把收到的包打印到文件中去而已,可以去掉  
  我现在问题是在第二次向界面写数据的时候报内存访问异常,是否在这里需要进行线程同步

接收的时候,是否缓冲中有内容跳ServerExecute的时候就会报异常呢

需要同步操作界面,因为AThread的Execute是多线程执行的,如果多个客户同时连接的时候就会出错。所以你要用Athread.Synchronize函数同步操作界面

忘记delphi中的string是个数组了,晕,要用ms.write(ms[1],size)来读数组

其实是DELPHI中的STRING的问题,晕死,DELPHI中的String类型比较奇特

线程中用VCL,必须Synchronize方法

我怀疑你的mo中有异常字符,在加入前好好检查一下或用其它方式来显示

加个断点去看看mo中是什么不就有数了?

posted on 2009-05-26 17:28 delphi2007 阅读(180) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。