Multithreading 德尔福:如何锁定;Socket.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

我有几个客户端,它们向一个套接字(不是端口)写入数据,当它们一起写入时,我收到垃圾,来自所有客户端的所有数据都被合并

所有客户端都在同一程序中的线程中

我需要锁定write()

我怎么做

谢谢


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。实际上,它不必是全局的,也可以是类的成员。这取决于代码的总体结构。如果它是一个简单的控制台应用程序,那么是的,您可以在global
var
部分声明它。CS应该在创建可写套接字时创建—将其存储在使用的任何套接字上下文中。您可以重写write()来获取/释放它吗?
CriticalSection.Enter;
try
  ASocket.Connection.Socket.Write(buf);
finally
  CriticalSection.Leave;
end;