Bonjour,

J'utilise dans différents programmes le composant Indy TIdFTP, afin de gérer mes accès et transferts FTP.

Je me suis rendu compte récemment que lorsqu'on fait une connexion au serveur FTP, puis éventuellement différents requêtes, il arrive que le serveur FTP ne réponde plus. Et dans ce cas là, le composant TIdFtp ne renvoie pas une erreur, il reste en attente d'une réponse du serveur FTP, et mon programme reste figé.

Exemple de prog d'accès FTP :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
TIdFTP *idftp = new TIdFTP(NULL);
idftp->Passive = true;
idftp->Host     = hote;
idftp->Port     = port;
idftp->User     = login;
idftp->Password = password;
 
idftp->Connect();
 
...
 
idftp->Disconnect();
delete idftp;
J'ai tenté un try{ idftp->Connect();} catch(...) pour détecter un éventuel événement "erreur" ou "délai de reponse trop long" mais le composant ne gère pas cela...

Auriez-vous des solutions pour faire en sorte qu'une absence de réponse du serveur FTP ne bloque pas mon appli ? Sachant que j'aimerais bien conserver le composant Indy FTP et tout ce que j'ai déjà fait autour...

Je pensais à appeler la partie connexion FTP / transfert / déconnexion via un thread et tuer automatiquement le thread s'il ne répond pas au bout d'un certain temps, mais je ne parviens pas à tuer correctement le thread ( le thread attend que la connexion FTP soit fermée et comme le serveur FTP ne répond plus, ça n'arrive jamais et mon prog reste bloqué)...

Voilà ce que j'avais fait avec les threads :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//---------------------------------------------------------------------------
class TMonThreadFTP : public TThread
{
private:
protected:
       void __fastcall Execute();
public:
        __fastcall TMonThreadFTP(bool CreateSuspended);
        Ftp *ftp;
};
//---------------------------------------------------------------------------
__fastcall TMonThreadFTP::TMonThreadFTP(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
 
//---------------------------------------------------------------------------
void __fastcall TMonThreadFTP::Execute()
{
TIdFTP *idftp = new TIdFTP(NULL);
idftp->Passive = true;
idftp->Host     = hote;
idftp->Port     = port;
idftp->User     = login;
idftp->Password = password;
 
while(!this->Terminated)
{
        idftp ->Connect();
 
        Suspend();
}
delete idftp;
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonDemarrerConnexionFtpClick(TObject *Sender)
{
MonThreadFTP = new TMonThread(false);
MonThreadFTP->FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ButtonTuerConnexionFtpClick(TObject *Sender)
{
delete MonThreadFTP;
}
//---------------------------------------------------------------------------
Merci par avance pour votre aide et vos idées !