【发布时间】:2011-07-21 07:23:07
【问题描述】:
我创建了一个 TThread 类来执行一些套接字操作,问题是,除非我向其中添加 MessageBox,否则代码不起作用,除非我在它之前放置 MessageBox 调用,否则套接字将不起作用
Sleep(2000); //Waiting for the Socket to Come to the Array
// Messagebox(0, '', '', 0); { Wont work unless this line is Uncommented }
if Server.ClientList[Handle] <> nil then
begin
if (Server.ClientList[Handle].Connected) and (AppSocket.Connected) do
begin
// Send Data on Socket
// Relay Data between Server.ClientList[Handle] and AppSocket;
end;
【问题讨论】:
-
我的想法是 TCP 通信可能需要一个消息队列来处理,而 MessageBox 正在提供该功能。
-
@mj2008,我也想过,但这很奇怪:
MessageBox肯定会在显示时发送消息,但是一旦结束,就不会再发送消息了,因为 OP 没有提到实现消息泵。可能有足够多的消息在盒子出现在屏幕上时通过,从而制造出在通话之后一切正常的错觉,但事实上,所有可用的数据都是在消息出现在屏幕上时使其低谷的数据。 -
到底谁认为阻止我们在 cmets 中使用多个 @usernames 是个好主意?! Stack Overflow 过去的业务是让我们更容易沟通。非常糟糕的决定。有人为用户着想!
-
绝对是消息泵问题;不看更多代码就无法说出更多。
-
正如其他海报所强调的那样,在辅助线程中使用基于 Windows 消息的 TCP 系统是不可取的,这一行也有些令人担忧:'Sleep(2000); //等待套接字进入数组'。这可能很好,但是当线程死了两秒钟时发生了什么?
标签: multithreading delphi delphi-7 tthread