【发布时间】:2015-12-17 14:42:27
【问题描述】:
这篇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 代码,该异常就会消失。
【问题讨论】:
-
你为什么要做这种奇怪的事情?如果要引发线程,为什么要非阻塞? TClientSocket 实例的构造函数调用在哪里?请不要说您将其转储到表单上:((
-
在创建线程后立即在线程的初始化函数中创建套接字,如@987654329@ 然后
mySocket.ClientType := ctNonBlocking;。我将套接字设置为非阻塞,因为它看起来更容易,但我是来学习的。如果这是一件奇怪的事情,那么我将看看阻止选项...... -
查看对已接受解决方案的评论。基本上我遵循了问题中提到的 Embarcadero 文章中的示例代码(将 TClientSocket 从非阻塞模式转换为阻塞模式)。事实证明这是相对简单的。当然,我之前使用它的方式很“奇怪”……在线程内以阻塞模式使用它效果很好!
标签: multithreading sockets delphi delphi-7