【发布时间】:2012-07-24 05:55:03
【问题描述】:
我目前在客户端 (IdTCPClient) 和服务器 (IdTCPServer) 之间有稳定的代码,一切都按计划工作。但是,当我从按钮的 OnClick 事件调用以下函数时,服务器会冻结。
var
SendStream: TMemoryStream;
FileStream: TFileStream;
List: TList;
I: Integer;
begin
try
//Load
FileStream := TFileStream.Create(Path, fmOpenRead);
FileStream.Position := 0;
//Place into stream
SendStream := TMemoryStream.Create;
SendStream.Write(Header, SizeOf(Header)); //This works; supporting code ommitted for brevity
SendStream.CopyFrom(FileStream, FileStream.Size);
SendStream.Position := 0;
TIdContext(fTCP.Contexts.LockList[0]).Connection.IOHandler.Write(SendStream, 0, True);
fTCp.Contexts.LockList;
if Assigned(Self.fServerOnSync) then Self.fServerOnSync(SizeOf(Header)) //event handler for main form
finally
FileStream.Free;
SendStream.Free;
end;
我猜它与死锁线程有关,但对于我来说,我不知道为什么会发生这种情况。
另外,如果我将上面的代码封装在某个包含 IdTCP 服务器的类中,它将调用我的自定义 fServerOnSync 事件,这是线程安全的吗?
干杯, 阿德里安
【问题讨论】:
-
问:“Self.fServerOnSync()”到底是什么?
-
type TServerOnSync = procedure(HeaderSize: Integer) of Object;对不起;所有这些都包装在一个以 IdTCPServer 作为字段的类中。因此,当我实例化这个类时,我设置了这个事件。
-
即使注释掉该行仍然会导致写入冻结:/
标签: delphi client-server indy