我用IndyTcpServer的时候,收到信息写到界面的时候报异常,请问怎么回事 Delphi / Windows SDK/APIhttp://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中是什么不就有数了?