在线程内使用非阻塞TClientSocket

时间:2015-12-17 14:42:28

标签: multithreading sockets delphi delphi-7

这篇Embarcadero文章描述了在线程中使用阻塞套接字。如果我已将我的套接字创建为ctNonBlocking,并且我只使用TClientWinSocket.SendText向套接字编写简单消息:

// Inside TThread::Execute: Option 1
strMessage := 'Hello!';
mySocket.Socket.SendText(strMessage);

或者我应该创建TWinSocketStream并使用Write

// Inside TThread::Execute: Option 2
strMessage := 'Hello!';
stream := TWinSocketStream.Create(mySocket.Socket, 1000);
stream.Write(strMessage[1], Length(strMessage));

我发现我的应用程序退出时(在DPR文件中Application.Run()之后并且无法调试)会抛出异常,如果我注释掉所有TClientSocket代码,它就会消失。

1 个答案:

答案 0 :(得分:1)

如果套接字处于非阻塞模式,则无法使用TWinSocketStream。如果套接字未处于阻塞模式,TWinSocketStream的构造函数将引发异常。这在documentation

中说明
  

使用TWinSocketStream通过阻止套接字连接读取或写入信息......

     

...

     

注意:TWinSocketStream不适用于非阻塞套接字。

非阻塞模式下的

TClientSocket在工作线程中工作正常(虽然阻塞模式是首选),前提是线程有消息循环。原因是因为在非阻塞模式下,TClientSocket创建了一个内部窗口并将其与套接字关联。此窗口从WinSock接收消息以触发TClientSocket的事件。因此,必须在同一线程上下文中创建,使用和销毁非阻塞模式下的TClientSocket。不要跨越线程边界访问它。

阻止模式下的

TClientSocket没有这个限制。