CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

◆◆简单问题,up者有分◆◆

楼主haisha(海沙)2004-12-01 12:42:12 在 Delphi / 网络通信/分布式开发 提问

我想实现每隔一定时间就试图连接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

相关问题

  • 简单一题,先中者有分
  • 简单问题,进者拿分
  • 一个简单问题,答者有分!
  • 简单问题,答者有分!
  • 简单问题 ,答者有分
  • 初学者,简单问题,50分
  • 问题很简单,跟者都有分
  • 简单问题,来者给分!!
  • CEditView的简单问题,进者有分!
  • 很简单的问题 答者给分

关键词

  • 线程
  • 代码
  • 连接
  • 执行
  • 服务器
  • 修改
  • tmyftp
  • idftp
  • tidftp
  • iocmanager

得分解答快速导航

  • 帖主:haisha
  • beyondtkl
  • Sorder
  • SDC1015
  • zwjchina
  • zglwxb
  • ghchen
  • psp2003
  • zwjchina

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo