关于使用多程线连接应用服务的问题,大家帮帮忙
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,DB, DBClient, MConnect, SConnect, ComCtrls;
type
TForm1 = class(TForm)
SocketConnection1: TSocketConnection;
btn_linkserver: TButton;
edt_status: TEdit;
btn_disconnection: TButton;
edt_ip: TEdit;
IP: TLabel;
STATUS: TLabel;
procedure btn_linkserverClick(Sender: TObject);
procedure btn_disconnectionClick(Sender: TObject);
end;
type
link_server = class(TThread)
protected
procedure Execute; override;
public
constructor create;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn_linkserverClick(Sender: TObject);
var
link_server1:link_server;
begin
if socketconnection1.Connected then
socketconnection1.Close;
link_server1:=link_server.create;
end;
procedure TForm1.btn_disconnectionClick(Sender: TObject);
begin
SocketConnection1.Connected:=false;
end;
constructor link_server.create;
begin
inherited create(true);
self.FreeOnTerminate:=True;
self.Suspended:=false;
end;
procedure link_server.Execute;
begin
with form1.SocketConnection1 do
begin
close;
address:=form1.edt_ip.text;
ServerName:='p_hourse.c_hourse';
try
connected:=true;
except
end;
self.Destroy;
form1.edt_status.Text:='link over';
end;
end;
end.
当单击"btn_linkserver"按钮连接服务器完成后,再单击"btn_disconnection"按钮断开连接时就死机了。帮帮忙,兄弟!!!
问题点数:0、回复次数:2Top
1 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2003-11-03 20:28:58 得分 0
多線程中要注意同步的問題, 你可看看 Synchronize 的用法!!Top
2 楼seion(科龙)回复于 2003-11-03 22:39:10 得分 0
to aiirii
这样还不得,连一个后,再连时也会死机
-----------------------------还有没别的方法让其连接在后台运行也不在影响前台界面的响应
--------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,DB, DBClient, MConnect, SConnect, ComCtrls;
const CM_LINKED=WM_USER+$1001;
type
TForm1=class(TForm)
SocketConnection1: TSocketConnection;
btn_linkserver: TButton;
edt_status: TEdit;
btn_disconnection: TButton;
edt_ip: TEdit;
IP: TLabel;
STATUS: TLabel;
Edit1: TEdit;
Button1: TButton;
procedure btn_linkserverClick(Sender: TObject);
procedure btn_disconnectionClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
public statusid:dword; procedure onlinked(var message:Tmessage);message CM_LINKED;
end;
type
link_server = class(TThread)
private
host:string;
sockcon:TSocketConnection;
protected
procedure Execute; override;
procedure linkit;
public
constructor create(ahost:string;asockcon:TSocketConnection);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn_linkserverClick(Sender: TObject);
var
link_server1:link_server;
begin
if socketconnection1.Connected then
socketconnection1.Close;
link_server1:=link_server.create(edt_ip.Text,SocketConnection1);
link_server1.Resume;
// while form1.statusid=2 do
// application.ProcessMessages;
end;
procedure TForm1.btn_disconnectionClick(Sender: TObject);
begin
SocketConnection1.Connected:=false;
end;
constructor link_server.create(ahost:string;asockcon:TSocketConnection);
begin
inherited create(true);
host:=ahost;
self.FreeOnTerminate:=True;
self.Suspended:=true;
sockcon:=asockcon;
end;
procedure link_server.Execute;
begin
Synchronize(linkit);
end;
procedure link_server.linkit;
begin
with form1.SocketConnection1 do
begin
close;
address:=form1.edt_ip.Text;
ServerName:='p_hourse.c_hourse';
try
postmessage(form1.Handle,CM_LINKED,0,2);
connected:=true;
//postmessage(form1.Handle,CM_LINKED,0,1);
except
//postmessage(form1.Handle,CM_LINKED,0,2);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
statusid:=2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(socketconnection1.Address);
if form1.SocketConnection1.Connected then
edit1.Text:='ture' else
edit1.Text:='false';
end;
procedure TForm1.onlinked(var message: Tmessage);
begin
if message.LParam=2 then
edit1.Text:='dolink';
if message.LParam=0 then
edit1.Text:='link bad';
if message.LParam=1 then
edit1.Text:='link suceess';
end;
end.
----------Top




