偶是初学者,请教各位高手一个简单问题.请帮帮我,小女子这厢有礼拉!
我用Tcpclient和Tcpserver控件实现数据自动传输,采用多线程技术.目的时判断memrecv接收来得消息符合某一条件时,memsend自动显示出回复信息,并触发发送事件.问题是发送事件触发不了,还需要再点击发送按钮才执行.所需控件见程序,程序(改的delphi里的netchat)代码如下:unit Chatmain;interfaceuses
Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;
type
TForm1 = class(TForm)
memRecv: TMemo;
Panel1: TPanel;
memSend: TMemo;
Panel2: TPanel;
btnSend: TButton;
Panel3: TPanel;
Label1: TLabel;
edtRemoteHost: TEdit;
Label2: TLabel;
edtRemotePort: TEdit;
Label3: TLabel;
edtLocalPort: TEdit;
btnActivateServer: TButton;
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
procedure btnSendClick(Sender: TObject);
procedure TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
procedure btnActivateServerClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; // you must create your own thread to synch
// writing to a gui component
TClientDataThread = class(TThread)
private
public
ListBuffer :TStringList;
TargetList :TStrings;
procedure synchAddDataToControl;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
procedure Terminate;
end;var
Form1: TForm1;
//DataThread: TClientDataThread;implementation{$R *.xfm}//------------- TClientDataThread impl -----------------------------------------
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := true;
ListBuffer := TStringList.Create;
end;procedure TClientDataThread.Terminate;
begin
ListBuffer.Free;
inherited;
end;procedure TClientDataThread.Execute;
begin
Synchronize(synchAddDataToControl);
end;procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;
//------------- end TClientDataThread impl -------------------------------------
procedure TForm1.btnActivateServerClick(Sender: TObject);
begin
TcpServer1.LocalPort := edtLocalPort.Text;
TcpServer1.Active := True;end;procedure TForm1.btnSendClick(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := edtRemoteHost.Text;
TcpClient1.RemotePort := edtRemotePort.Text;
try
if TcpClient1.Connect then
for I := 0 to memSend.Lines.Count - 1 do
TcpClient1.Sendln(memSend.Lines[I]);
finally
TcpClient1.Disconnect;
end;
// memSend.Clear;
end;procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s: string;
DataThread: TClientDataThread;
begin DataThread:= TClientDataThread.Create(true); DataThread.TargetList := memRecv.Lines ; s := ClientSocket.Receiveln;
while s <> '' do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
memSend.Lines.Clear; if memRecv.Lines[0]='hello' then
begin
memSend.Lines.Add('hello,shoudaole');
Form1.btnSendClick(Sender); //为什么不执行???
end; DataThread.Resume;
end;end.
我用Tcpclient和Tcpserver控件实现数据自动传输,采用多线程技术.目的时判断memrecv接收来得消息符合某一条件时,memsend自动显示出回复信息,并触发发送事件.问题是发送事件触发不了,还需要再点击发送按钮才执行.所需控件见程序,程序(改的delphi里的netchat)代码如下:unit Chatmain;interfaceuses
Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;
type
TForm1 = class(TForm)
memRecv: TMemo;
Panel1: TPanel;
memSend: TMemo;
Panel2: TPanel;
btnSend: TButton;
Panel3: TPanel;
Label1: TLabel;
edtRemoteHost: TEdit;
Label2: TLabel;
edtRemotePort: TEdit;
Label3: TLabel;
edtLocalPort: TEdit;
btnActivateServer: TButton;
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
procedure btnSendClick(Sender: TObject);
procedure TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
procedure btnActivateServerClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; // you must create your own thread to synch
// writing to a gui component
TClientDataThread = class(TThread)
private
public
ListBuffer :TStringList;
TargetList :TStrings;
procedure synchAddDataToControl;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
procedure Terminate;
end;var
Form1: TForm1;
//DataThread: TClientDataThread;implementation{$R *.xfm}//------------- TClientDataThread impl -----------------------------------------
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := true;
ListBuffer := TStringList.Create;
end;procedure TClientDataThread.Terminate;
begin
ListBuffer.Free;
inherited;
end;procedure TClientDataThread.Execute;
begin
Synchronize(synchAddDataToControl);
end;procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;
//------------- end TClientDataThread impl -------------------------------------
procedure TForm1.btnActivateServerClick(Sender: TObject);
begin
TcpServer1.LocalPort := edtLocalPort.Text;
TcpServer1.Active := True;end;procedure TForm1.btnSendClick(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := edtRemoteHost.Text;
TcpClient1.RemotePort := edtRemotePort.Text;
try
if TcpClient1.Connect then
for I := 0 to memSend.Lines.Count - 1 do
TcpClient1.Sendln(memSend.Lines[I]);
finally
TcpClient1.Disconnect;
end;
// memSend.Clear;
end;procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s: string;
DataThread: TClientDataThread;
begin DataThread:= TClientDataThread.Create(true); DataThread.TargetList := memRecv.Lines ; s := ClientSocket.Receiveln;
while s <> '' do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
memSend.Lines.Clear; if memRecv.Lines[0]='hello' then
begin
memSend.Lines.Add('hello,shoudaole');
Form1.btnSendClick(Sender); //为什么不执行???
end; DataThread.Resume;
end;end.
Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;
type
TForm1 = class(TForm)
memRecv: TMemo;
Panel1: TPanel;
memSend: TMemo;
Panel2: TPanel;
btnSend: TButton;
Panel3: TPanel;
Label1: TLabel;
edtRemoteHost: TEdit;
Label2: TLabel;
edtRemotePort: TEdit;
Label3: TLabel;
edtLocalPort: TEdit;
btnActivateServer: TButton;
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
procedure btnSendClick(Sender: TObject);
procedure TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
procedure btnActivateServerClick(Sender: TObject);
private
{ Private declarations }
public
Flag:integer;//标志位,0,1 { Public declarations }
end; // you must create your own thread to synch
// writing to a gui component
TClientDataThread = class(TThread)
private
public
ListBuffer :TStringList;
TargetList :TStrings;
procedure synchAddDataToControl;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
procedure Terminate; end;var
Form1: TForm1;
//DataThread: TClientDataThread;implementation{$R *.xfm}//------------- TClientDataThread impl -----------------------------------------
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := true;
ListBuffer := TStringList.Create;
end;procedure TClientDataThread.Terminate;
begin
ListBuffer.Free;
inherited;
end;procedure TClientDataThread.Execute;
begin
Synchronize(synchAddDataToControl);
end;procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;
//------------- end TClientDataThread impl -------------------------------------
procedure TForm1.btnActivateServerClick(Sender: TObject);
begin
TcpServer1.LocalPort := edtLocalPort.Text;
TcpServer1.Active := True;
Flag := 0;//标志位置0
end;procedure TForm1.btnSendClick(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := edtRemoteHost.Text;
TcpClient1.RemotePort := edtRemotePort.Text;
try
if TcpClient1.Connect then
begin
for I := 0 to memSend.Lines.Count - 1 do
TcpClient1.Sendln(memSend.Lines[I]);
end;
finally
TcpClient1.Disconnect;
end;
//memSend.Clear;
end;procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s: string;
DataThread: TClientDataThread;
begin DataThread:= TClientDataThread.Create(true); DataThread.TargetList := memRecv.Lines ; s := ClientSocket.Receiveln; while s <> '' do
begin
DataThread.ListBuffer.Add(s);
memRecv.Lines.Add(s);
s := ClientSocket.Receiveln;
end; memSend.Lines.Clear; if (memRecv.Lines[0]='hello') and (Flag = 0) then
begin
Flag := 1;
memSend.Lines.Add('hello,shoudaole');
Form1.btnSend.OnClick(SELF); end; DataThread.Resume;
end;end.