Indy自带的Demo里,是在连接成功后创建了一个线程来监听连接里是否有消息进来的,代码如下: TClientHandleThread = class(TThread)
private
CB: TCommBlock; procedure HandleInput; protected
procedure Execute; override; end;var
ClientFrmMain: TClientFrmMain;
ClientHandleThread: TClientHandleThread; // variable (type see above)implementation{$R *.DFM}procedure TClientHandleThread.HandleInput;
begin
if CB.Command = 'MESSAGE' then
ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
else
if CB.Command = 'DIALOG' then
MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
else // unknown command
MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not ClientFrmMain.Client.Connected then
Terminate
else
try
ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
begin
if CBClientActive.Checked then
begin
try
Client.Connect(10000); // in Indy < 8.1 leave the parameter away ClientHandleThread := TClientHandleThread.Create(True);
ClientHandleThread.FreeOnTerminate:=True;
ClientHandleThread.Resume;
except
on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
end;
end
else
begin
ClientHandleThread.Terminate;
Client.Disconnect;
end; ButtonSend.Enabled := Client.Connected;
CBClientActive.Checked := Client.Connected;
end;procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
var
CommBlock : TCommBlock;begin
CommBlock.Command := EditCommand.Text; // assign the data
CommBlock.MyUserName := Client.LocalName;
CommBlock.Msg := EditMessage.Text;
CommBlock.ReceiverName := EditRecipient.Text; Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;
我的问题是它创建的这个监听线程,是怎么做到的有信息来时才进去显示操作(Synchronize(HandleInput);
)的,我想的是它既然是个线程,只要Terminated为真,它就会一直的读呀,而会把空消息也读进来的。我在线程里下过断点,实际情况是只有有消息进来时才进行显示操作,没消息时进不来。。这是为什么,请大家知道的解解惑。
private
CB: TCommBlock; procedure HandleInput; protected
procedure Execute; override; end;var
ClientFrmMain: TClientFrmMain;
ClientHandleThread: TClientHandleThread; // variable (type see above)implementation{$R *.DFM}procedure TClientHandleThread.HandleInput;
begin
if CB.Command = 'MESSAGE' then
ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
else
if CB.Command = 'DIALOG' then
MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
else // unknown command
MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not ClientFrmMain.Client.Connected then
Terminate
else
try
ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
begin
if CBClientActive.Checked then
begin
try
Client.Connect(10000); // in Indy < 8.1 leave the parameter away ClientHandleThread := TClientHandleThread.Create(True);
ClientHandleThread.FreeOnTerminate:=True;
ClientHandleThread.Resume;
except
on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
end;
end
else
begin
ClientHandleThread.Terminate;
Client.Disconnect;
end; ButtonSend.Enabled := Client.Connected;
CBClientActive.Checked := Client.Connected;
end;procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
var
CommBlock : TCommBlock;begin
CommBlock.Command := EditCommand.Text; // assign the data
CommBlock.MyUserName := Client.LocalName;
CommBlock.Msg := EditMessage.Text;
CommBlock.ReceiverName := EditRecipient.Text; Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;
我的问题是它创建的这个监听线程,是怎么做到的有信息来时才进去显示操作(Synchronize(HandleInput);
)的,我想的是它既然是个线程,只要Terminated为真,它就会一直的读呀,而会把空消息也读进来的。我在线程里下过断点,实际情况是只有有消息进来时才进行显示操作,没消息时进不来。。这是为什么,请大家知道的解解惑。
是的,但我们平时创建一个线程,也这样写的话,不是会在那个While循环里一直重复,而不受其他影响么,它那个是只有收到消息才进去,下过断点测试过的,到这里就看不懂了。