PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Problème de transfert FTP avec thread
Problème de transfert FTP avec thread
Débuté par JP chane, 07 oct. 2021 09:37 - 4 réponses
Membre enregistré
19 messages
Popularité : +1 (1 vote)
Posté le 07 octobre 2021 - 09:37
Bonjour à tous,

Je rencontre un problème avec une partie de mon application.
Lorsque je procède à un transfert FTP de fichiers (en général de l'ordre de qq 10aines de Mo, en wifi par hotspot 4G dans la plupart des cas), en passant par un thread pour mettre à jour ma fenêtre, il arrive que l'exécution de mon code stoppe lors du prochain appel de thread, je suspecte en cas de perte de paquet.
Ci-dessous la partie du code concernée.

ThreadExecute("Thread1", threadNormal, MAJ_Complete)

idConnexion = FTPConnecte(gclParamTP.m_sAddrFTP, gclParamTP.m_sLogFTP, gclParamTP.m_sPassFTP, gclParamTP.m_sPortFTP, Vrai, 300)

SI FTPFichierExiste(idConnexion, MonFichierSourceZip) ALORS
....ExécuteThreadPrincipal(JaugeTrans, 1)
....SI FTPRécupère(idConnexion, MonFichierSourceZip, MaDestination, Jauge_Transfert) = Vrai ALORS
........fSupprime(CopieDuFichier)
........ExécuteThreadPrincipal(JaugeTrans, 0)
........fCopieFichier(MaDestination, CopieDuFichier)
........FTPSupprimeFichier(MonFichierSourceZip)
........RENVOYER 0
....SINON
........ExécuteThreadPrincipal(JaugeTrans, 0)
........SI OuiNon(0, "Erreur lors de la réception de la MAJ", "Voulez-vous essayer à nouveau ?") ALORS
............RENVOYER ReceptMAJZip(idConnexion)
........FIN
....FIN
SINON
....RENVOYER -1
FIN

Procedure Jauge_Transfert(nTotal, nCourant)
JAUGE_Progression_DL.BorneMin = 0
JAUGE_Progression_DL.BorneMax = nTotal
JAUGE_Progression_DL.Valeur = nCourant
CalcPourcent est un numérique
CalcPourcent = nCourant * 100
CalcPourcent = CalcPourcent / nTotal
LIB_Pourcent = NumériqueVersChaîne(Arrondi(CalcPourcent)) + " %"
MultitâcheRepeint()
RENVOYER Vrai


Avez-vous déjà rencontré ce problème, ou auriez-vous des idées de pistes me permettant d'identifier et corriger ce problème ?

À dispo si plus de question sur mon code,
D'avance merci et bonne journée,
Membre enregistré
3 345 messages
Popularité : +93 (137 votes)
Posté le 07 octobre 2021 - 12:59
Il faut éviter les thread quand on utilise une fenêtre sur mobile
Ici tu utilise une jauge
Pour vérifier cela met en commentaire les ExécuteThreadPrincipal(Jauge
Et réessaye
Membre enregistré
19 messages
Popularité : +1 (1 vote)
Posté le 07 octobre 2021 - 16:20
Popoy a écrit :
Il faut éviter les thread quand on utilise une fenêtre sur mobile
Ici tu utilise une jauge
Pour vérifier cela met en commentaire les ExécuteThreadPrincipal(Jauge
Et réessaye


J'ai déjà fait ce test, et en effet le problème se déplace alors au prochain appel de thread, que j'utilises pour mettre à jour des libellés sur ma fenêtre dynamiquement
Est-ce qu'il y a un test qui peut être fait ou une parade pour ne pas se retrouver bloquer ?
J'avoue avoir en plus du mal à identifier la source du problème
Membre enregistré
3 345 messages
Popularité : +93 (137 votes)
Posté le 07 octobre 2021 - 19:35
JP chane a écrit :
J'ai déjà fait ce test, et en effet le problème se déplace alors au prochain appel de thread, que j'utilises pour mettre à jour des libellés sur ma fenêtre dynamiquement
Est-ce qu'il y a un test qui peut être fait ou une parade pour ne pas se retrouver bloquer ?
J'avoue avoir en plus du mal à identifier la source du problème

Toutes les mises à jour d'ihm, c'est pareil, pas de thread.
En plus, sur mobile l'asynchrone est a privilégier.
Avec callback, etc
Personnellement, pour ce genre de choses
Je fais comme pour nation qui fonctionne sur la prochaine fenêtre ouverte
J'ai créé une fenêtre principale avec des boutons non visible
L'utilisateur crois que c'est un screenshots
Et je fais des exécuté traitement des boutons
Cela mets à jour les fenêtres
Il faut aussi penser aux indirections
J'évite les tread au maximum
Je sais que cela complique ceux qui aiment les classes et les objets
Mais c'est comme ça avec wm et les mobiles
Posté le 07 octobre 2021 - 21:45
ca fait des années que j'utilise des threads en mobile avec des fenêtres sans aucun problème...


-LA- règle à suivre, c'est AUCUN ACCES à l'interface utilisateur, ni aux champs, ni avec des infos ou des ouinon ou des trace ou quoi que ce soit de ce genre...

Et si jamais tu utilise autre chose que des variables globales, il faut aussi le faire dans des sections critiques

La, dans le code du thread secondaire, si tu as un problème, tu essaye de faire un ouinon, et ca te plante, c'est tout... Ce genre de pratique est COMPLETEMENT INTERDITE