Multithreading 德尔福:如何锁定;Socket.Write";然后解锁?
我有几个客户端,它们向一个套接字(不是端口)写入数据,当它们一起写入时,我收到垃圾,来自所有客户端的所有数据都被合并 所有客户端都在同一程序中的线程中 我需要锁定write() 我怎么做 谢谢Multithreading 德尔福:如何锁定;Socket.Write";然后解锁?,multithreading,delphi,indy,Multithreading,Delphi,Indy,我有几个客户端,它们向一个套接字(不是端口)写入数据,当它们一起写入时,我收到垃圾,来自所有客户端的所有数据都被合并 所有客户端都在同一程序中的线程中 我需要锁定write() 我怎么做 谢谢 Delphi 2010,Indy 10,Win7您可以使用TCriticalSection(SyncObjs单元):将写入放在输入和离开之间: CriticalSection.Enter; try ASocket.Connection.Socket.Write(buf); finally Crit
Delphi 2010,Indy 10,Win7您可以使用
TCriticalSection
(SyncObjs
单元):将写入
放在输入
和离开
之间:
CriticalSection.Enter;
try
ASocket.Connection.Socket.Write(buf);
finally
CriticalSection.Leave;
end;
方法
Acquire
和Release
执行相同的操作()。重要提示:如果在代码的多个点写入套接字,则必须使用同一个对象(在上述示例中我称之为CriticalSection
) CriticalSection变量必须是全局变量?我需要。创建();第一次去某个地方?当然。您必须将CriticalSection
声明为TCriticalSection
,并使用CriticalSection:=TCriticalSection.create创建它
并使用CriticalSection.Free发布它代码>在您使用完套接字后,不再需要锁。我会让CS成为您用于ASocket
的任何类的成员,这样您就可以拥有每个连接的锁,例如:ASocket.lock.Enter代码>。但是,是的,您需要创建()和()自由()
CS。实际上,它不必是全局的,也可以是类的成员。这取决于代码的总体结构。如果它是一个简单的控制台应用程序,那么是的,您可以在globalvar
部分声明它。CS应该在创建可写套接字时创建—将其存储在使用的任何套接字上下文中。您可以重写write()来获取/释放它吗?
CriticalSection.Enter;
try
ASocket.Connection.Socket.Write(buf);
finally
CriticalSection.Leave;
end;