我的程序,有一个用计时器做的捕捉图片,生成文件 
                另外开了一个线程,上传图片到服务器上. 我在timer里的创建上传线程             
            hthread   :=   CreateThread(nil,       //Security   attribute 
                0,                                                           //Initial   Stack 
                @ThreadFunc,                                       //上传函数 
                nil,                                                       //argument   of   thread 
                0,                                                           //   Create   flags 
                ThreadID);                                           //   thread   ID 
            if   hthread   =   0   then 
            begin 
                showMessage( '无线程!   '); 
            end; 上传函数: 
procedure   ThreadFunc(Flag:   boolean)   stdcall; 
var 
    setUpFile           :   Tinifile; 
    ftpAddress         :   string; 
    ftpUname             :   string; 
    ftpPwd                 :   string; 
    ftpPicPath         :   string; 
    led_Id                 :   string; begin 
    setUpFile   :=   Tinifile.create(extractfiledir(application.ExeName)+ '\setup.ini '); 
    ftpAddress   :=   setUpFile.readstring( 'FTP地址 ', 'ftp_address ', ' '); 
    ftpUname   :=   setUpFile.readstring( 'FTP用户名 ', 'ftp_uname ', ' '); 
    ftpPwd   :=   setUpFile.readstring( 'FTP登陆密码 ', 'ftp_pwd ', ' '); 
    ftpPicPath   :=   setUpFile.readstring( 'FTP图片地址 ', 'ftp_pic_path ', ' '); 
    led_Id   :=   setUpFile.readstring( '屏号 ', 'screenid ', ' '); 
    setUpFile.free; 
    with       DLink_Form.idftp1       do 
    try 
        Username:=   ftpUname; 
        Password:=   ftpPwd; 
        Host:=   ftpAddress; 
        //passive:=true; 
        if   not   Connected   then 
        begin 
            connect; 
        end; 
    except 
        showmessage( '程序异常退出 '); 
    end;     if       DLink_Form.IdFtp1.Connected       then 
    begin 
        //DLink_Form.idftp1.Delete(DLink_Form.idftp1.RetrieveCurrentDir+ftpPicPath+led_Id+ '.jpg '); 
        DLink_Form.idftp1.Put(extractfiledir(application.ExeName)+ '\test.jpg ',DLink_Form.idftp1.RetrieveCurrentDir+ftpPicPath+led_Id+ '.jpg ',false); 
          DLink_Form.idftp1.disconnect; 
    end 
    else 
    begin 
        application.MessageBox( 'FTP没有连上! ', '提示: '); 
    end; 
    Play_Form.mainTemp   :=   0;     //全局变量,在TIMER里面判断它,然后做捕捉图片的程序。 
end; 
执行几次,有时是几分钟,有时长点时间,到idftp1.Put的时候就出现错误了 
EIdprotocolRelyError   with   message   Port   Command的提示 网上搜过几个答案,我把idftp1.passive   :=   true;会出现连接错误 

解决方案 »

  1.   

    Indy组件有不少毛病,我也是用它多线程上传,有时候明明Connected=true,可事实是断开的(ftp server上查看无连接)
    源码太复杂,没去研究,我现在用的方法是给它个错误计数器,如果一个上传组件上传过程中遇到的错误数超过一定数值,就释放它,重新create一个
      

  2.   

    to hongqi162 :用tcp/ip上传是要换控件吗?换哪个控件?
    to ysai : 你是用捕捉异常的方法计算错误次数的吧,你指的重新创建一个组件是怎么做的,我没有做过
                它是可视组件,该怎么创建
      

  3.   

    IDFtp明明是不可视组件.....
    你不会用代码创建组件吗?
    把原来的free,再用代码创建一次不就行了
    我的idftp组件是动态创建的,它属于一个对象,对象有个错误计数器,如果错误数太多,就
    FIdFTP.Free;
    FIdFTP := TIdFTP.Create(nil);
    ......//设置属性
      

  4.   

    to   ysai : 我这样动态创建FIdFTP后,put上传,然后disconnect后,其实线程对文件的操作并没有结束
                  因为我在之后的捕捉图片,刷新上传的图片的时候,提示错误,另一个程序正在使用此文件
                  怎样判断FIdFTP的put上传已经完全释放了对文件的操作呢