◆◆简单问题,up者有分◆◆
我想实现每隔一定时间就试图连接ftp服务器,判断是否可以连接成功,
在我的代码中可以实现,但是在连接过程中,如果随意给定ip(比如ip地址是一个不同网段的ip)导致连接失败,程序在连接过程中就好像死机一样,不能进行其它的操作,只有试图连接完成以后才能进行其它操作,我已经在程序中使用了线程,还是不行,请哪位高手帮我修改一下,使得进行连接ftp服务器的过程中,也可以进行其它的操作,
我的代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdFTP, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
IdFTP1: TIdFTP;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMYFTP = class(TThread)
private
FTP: TIdFTP;
protected
procedure Execute; override;
public
constructor Create(FTP1: TIdFTP); virtual;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TMYFTP.Execute;{ 执行线程的方法 }
begin
try
FTP.Connect();
except
application.MessageBox ('试图连接ftp服务器失败!!!','FTP连接错误!',0) ;
end;
end;
constructor TMYFTP.Create(FTP1: TIdFTP);
begin
FTP := FTP1;
inherited Create(true);
FreeOnTerminate := False;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
VAR
Q1: TMYFTP;
begin
idftp1.Host := '103.16.0.172';
idftp1.Port := 21000;
idftp1.Password :='iocmanager';
idftp1.User := 'ioc';
Q1 := TMYFTP.Create(IdFTP1);
Q1.Execute;
Q1.Terminate;
Q1.Destroy;
end;
end.
问题点数:100、回复次数:13Top
1 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 12:49:00 得分 20
你的timer间隔时间 稍微设长一点 不然你这边的连接还没连完 又去连接。。。
或者 当你连不上的时候 disable the timer...之类的....
或者 你获得 connect的错误代码<如果可能的话> 根据不同的代码 进行不同的处理
比如说 如果是 IP地址错误之类的 那么就可能需要disable the timer了...Top
2 楼Sorder(要才没才,要貌没貌,你还愿意嫁给我吗)回复于 2004-12-01 12:52:28 得分 10
路过Top
3 楼SDC1015(壮志凌云)回复于 2004-12-01 12:53:34 得分 10
代码写的不错Top
4 楼zwjchina(蒲石)回复于 2004-12-01 12:53:40 得分 20
procedure TForm1.Timer1Timer(Sender: TObject);
VAR
Q1: TMYFTP;
begin
idftp1.Host := '103.16.0.172';
idftp1.Port := 21000;
idftp1.Password :='iocmanager';
idftp1.User := 'ioc';
Q1 := TMYFTP.Create(IdFTP1);
//Q1.Execute; 去掉
Q1.Terminate;
Q1.Free; //Q1.Destroy; 修改
end;
constructor TMYFTP.Create(FTP1: TIdFTP);
begin
FTP := FTP1;
inherited Create(false);//不要把线程挂起
FreeOnTerminate := False;
end;
Top
5 楼zglwxb(假钞换贞操)回复于 2004-12-01 13:02:29 得分 10
顶一下Top
6 楼haisha(海沙)回复于 2004-12-01 13:35:53 得分 0
to ; zwjchina(蒲石)
在该问题中,你把以下语句去掉,但在哪里执行连接呢?(我急啊)
Q1.ExecuteTop
7 楼haisha(海沙)回复于 2004-12-01 14:26:58 得分 0
帮我啊Top
8 楼haisha(海沙)回复于 2004-12-02 08:36:42 得分 0
wo dingTop
9 楼ghchen()回复于 2004-12-02 08:40:20 得分 10
不会,我顶Top
10 楼psp2003()回复于 2004-12-02 08:53:25 得分 10
UP ,
关注。。。。Top
11 楼zwjchina(蒲石)回复于 2004-12-04 21:39:04 得分 10
这个就要谈到Delphi中线程对象的问题了,Delphi中的线程对象是TThread
当调用TThread的Create方法时,有个Boolean形的参数,它的意义是创建线程后是否挂起线程
如果不挂起,那么调用TThread的Create方法后马上会自动执行Execute方法!
所谓的多线程,就是多个事情同时做,即
idftp1.Host := '103.16.0.172';
idftp1.Port := 21000;
idftp1.Password :='iocmanager';
idftp1.User := 'ioc';
Q1 := TMYFTP.Create(IdFTP1);//这里开始线程就开始执行Execute的代码了而主线程继续往下执行
Q1.Terminate;//主线程执行到这里时候,Execute里的代码还有可能在执行,也就是两段代码同时在
//工作
//注意,你这里代码还有问题,不过我先让你把线程概念搞清楚!
Q1.Free;
还有,如果你使用了线程就根本没必要使用Timer控件了,循环在Execute里面做可以了!
我简单的改下你的代码:
procedure TMYFTP.Execute;{ 执行线程的方法 }
begin
try
FTP.Connect();
except
application.MessageBox ('试图连接ftp服务器失败!!!','FTP连接错误!',0) ;//这个代码也有点问题!最好是发消息或者用信号量等方法把信息告诉给主线程,让主线程来显示这个信息
end;
end;
修改为:
procedure TMYFTP.Execute;
begin
while not Terminate do
begin
try
FTP.Connect();
except
发送消息给主线程:连接失败
end;
Sleep(100);
end;
end;
哎,仔细想想你这些代码还问题多多,而且我也不太清楚你想要实现什么!Top
12 楼madbo(风轻扬{十年磨一剑})回复于 2004-12-04 22:39:22 得分 0
呵呵,学习一下。Top
13 楼haisha(海沙)回复于 2004-12-05 18:34:43 得分 0
问题解决了,谢谢大家Top




