Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD10] Incompréhension d'erreur avec un Thread

8 réponses
Avatar
Georges Peyre
Bonjour

D'où peut provenir le problème d'exécution du Thread suivant ?



J'ai créé une procédure simple qui fait une copie de répertoire à
l'aide de fRepCopie(..)

En GLOBAL dans le code du projet
RepertoireOrigineCopie est une chaîne
RepertoireDestinataireCopie est une chaîne

En procédure locale ...
PROCEDURE ProcRepCopie()
// Copie du répertoire
ResCopie = fRepCopie(RepertoireOrigineCopie,
RepertoireDestinataireCopie, frJauge + frRécursif)

Nota :
Au moment de l'exécution ...
RepertoireOrigineCopie contient : C:\NomDuRépertoire
RepertoireDestinataireCopie contient : E:\NomDuRépertoire


-1- Cas sans problème :

Si j'exécute simplement ProcRepCopie() directement tout se passe bien

Le code est le suivant :

ProcRepCopie()
SI ResCopie = Faux ALORS
Erreur(ErreurInfo(errMessage))
SINON
Info("Le répertoire a été copié")
FIN

RESULTAT : OK




-2- Cas du problème avec Thread :

Par contre si j'essaie d'exécuter la même procédure avec le code
suivant :

ThreadExécute("Thread1", threadNormal, "ProcRepCopie")
SI ResCopie = Faux ALORS
Erreur(ErreurInfo(errMessage))
SINON
Info("Le répertoire a été copié")
FIN


RESULTAT : ResCopie est faux
La cause d'erreur suivante est renvoyée
"Le disque Z:\ n'est pas disponible"


Je ne comprend d'ou vient ce changement de lettre du lecteur



De plus je n'arrive pas à tracer ou afficher par info() le contenu des
chaines RepertoireOrigineCopie et RepertoireDestinataireCopie
dans la procédure ProcRepCopie lorsque elle est appelée par le Thread

Merci d'avance pour votre aide

Cordialement

--
Elle est pas belle la vie ?

8 réponses

Avatar
RF
Salut,

As-tu essayé de déclarer ta procédure en thread automatique sans
utilisation d'hyperfile? (Icone 1:30 à gauche de l'icone de
commentaire)

Le simple appel de la procédure fait qu'elle tourne dans un thread.

A essayer ;)
Avatar
Georges Peyre
Bonjour,

RF a pensé très fort :

As-tu essayé de déclarer ta procédure en thread automatique sans utilisation
d'hyperfile? (Icone 1:30 à gauche de l'icone de commentaire)

Le simple appel de la procédure fait qu'elle tourne dans un thread.

A essayer ;)



C'est ce que je viens de faire et ton bref commentaire sur l'appel m'a
plus éclairé que le texte de l'aide
Merci pour cette idée : en effet ce thread n'utilise pas de fichier
Hyper File.

J'ai fait un grand pas en avant car la fonction c'est bien exécutée en
appelant simplement la procédure.
Pour le moment je n'ai pas encore testé pour voir si c'est vraiment en
Thread ( seule une petite icone dans le code me signale que la
procédure est en Thread )



Mais PROBLEMES avec le code retour de la fonction
ResCopie est un booleen est défini en GLOBAL du code projet
Même si je le place dans la procédure Thread rien ne change pour les 2
essais

J'ai fait 2 essais

- ESSAI 1 -

La procédure ne contient que la fonction fRepCopie
PROCEDURE ProcRepCopie()
// Copie du répertoire
ResCopie = fRepCopie(RepertoireOrigineCopie,
RepertoireDestinataireCopie, frJauge + frRécursif)

Code appelant ...
ProcRepCopie()
SI ResCopie = Faux ALORS
Erreur(ErreurInfo(errMessage))
SINON
Info("Le répertoire a été copié")
FIN

RESULTAT
Dans ce cas ResCopie est faux alors que la copie s'est bien déroulée (
j'ai vu la jauge et le répertoire destinataire est OK en fin de copie )
La valeur de ResCopie n'est pas reconduite en dehors du thread



- ESSAI 2 -

La procédure du Thread automatique contient

PROCEDURE ProcRepCopie()

ResCopie = fRepCopie(RepertoireOrigineCopie,
RepertoireDestinataireCopie, frJauge + frRécursif)

// Affichage du message d'erreur si la copie n'a pas été effectuée
SI ResCopie = Faux ALORS
Erreur(ErreurInfo(errMessage))
SINON
Info("Le répertoire a été copié")
FIN


Le code appelant est simplement ProcRepCopie()

RESULTAT
Le problème est différent : dans la procédure Thread les fonctions
Info(..) et erreur(...) ne marchent pas ; les messages ne s'affichent
pas.


QUESTION : Quelle est la solution ?

Cordialement

--
Elle est pas belle la vie ?
Avatar
Emmanuel Haefele
"Georges Peyre" a écrit

Bonjour,

Mais PROBLEMES avec le code retour de la fonction
ResCopie est un booleen est défini en GLOBAL du code projet
Même si je le place dans la procédure Thread rien ne change pour les 2
essais



Je n'ai peut-être pas tout bien compris mais à priori dans ton test 1 tu
ne peux pas tester le résultat de ta copie endehors de la procédure
puisqu'à ce moment là, la copie n'est sans doute pas terminé. C'est un
thread, ne pas l'oublier !

Dans le test 2, tu mets des fonctions erreur ou info dans la procédure,
c'est interdit dans les thread, donc je suppose que tu t'appuies sur le
test qui se trouve endehors de la procédure mais là aussi tu ne peux pas
avoir un résultat correct il me semble puisque soit la copie n'est pas
fini à ce moment là, soit le thread est en attente sur la fonction info.
Non ?


Amicalement,

Emmanuel Haefelé.
Avatar
Georges Peyre
Bonsoir Emmanuel

Emmanuel Haefele a écrit :
"Georges Peyre" a écrit
Je n'ai peut-être pas tout bien compris mais à priori dans ton test 1 tu
ne peux pas tester le résultat de ta copie endehors de la procédure
puisqu'à ce moment là, la copie n'est sans doute pas terminé. C'est un
thread, ne pas l'oublier !

Dans le test 2, tu mets des fonctions erreur ou info dans la procédure,
c'est interdit dans les thread, donc je suppose que tu t'appuies sur le
test qui se trouve endehors de la procédure mais là aussi tu ne peux pas
avoir un résultat correct il me semble puisque soit la copie n'est pas
fini à ce moment là, soit le thread est en attente sur la fonction info.
Non ?



Ok pour ces 2 observations

Donc j'ai modifié la procédure Thread de cette façon pour récupérer le
résultat dans un fichier journal

// Copie du répertoire
ResCopie = fRepCopie(RepertoireOrigineCopie,
RepertoireDestinataireCopie, frJauge + frRécursif)

WJournal = ""
SI ResCopie = Faux ALORS
WJournal = WJournal + "Origine :" + RepertoireOrigineCopie + "
Destinataire :" + RepertoireDestinataireCopie + RC
WJournal = WJournal + RC + ErreurInfo(errMessage) + RC
SINON
WJournal = WJournal + "Origine :" + RepertoireOrigineCopie + "
Destinataire :" + RepertoireDestinataireCopie + RC
WJournal = WJournal + RC + "Le répertoire a été copié" + RC
FIN

WJournalPrecedent = fChargeTexte(fRepEnCours()+"FJOURNAL.TXT")
WJournal = WJournal + WJournalPrecedent
fSauveTexte(fRepEnCours()+"FJOURNAL.TXT", WJournal)


CONCLUSION

L'écriture du jounal ne se fait pas non plus : est-ce aussi une
impossibilité du thread ?

--
Elle est pas belle la vie ?
Avatar
Emmanuel Haefele
"Georges Peyre" a écrit:

Donc j'ai modifié la procédure Thread de cette façon pour récupérer le
résultat dans un fichier journal



J'ai repris ton code en créant une procédure "copierfichier" que j'appelle
par :

ThreadExécute ( "test", threadNormal, CopieFichier )

Et j'ai bien une copie qui c'est effectuée et un fichier fjournal.txt qui
a été écrit.

Ci-dessous la procédure et le résultat de la copie :

-=-=-- PROCEDURE CopieFichier()

RepertoireOrigineCopie est une chaîne = fRepEnCours() + "traceLicences"
RepertoireDestinataireCopie est une chaîne = fRepEnCours() + "tracesmtp"

ResCopie est un booléen = fRepCopie(RepertoireOrigineCopie, ...
RepertoireDestinataireCopie, frJauge + frRécursif)

WJournal est une chaîne = ""
SI ResCopie = Faux ALORS
WJournal = WJournal + "Origine :" + RepertoireOrigineCopie ...
+ " Destinataire :" + RepertoireDestinataireCopie + RC
WJournal = WJournal + RC + ErreurInfo(errMessage) + RC
SINON
WJournal = WJournal + "Origine :" + RepertoireOrigineCopie ...
+ " Destinataire :" + RepertoireDestinataireCopie + RC
WJournal = WJournal + RC + "Le répertoire a été copié" + RC
FIN

WJournalPrecedent est une chaîne fChargeTexte(fRepEnCours()+"FJOURNAL.TXT")
WJournal = WJournal + WJournalPrecedent
fSauveTexte(fRepEnCours()+"FJOURNAL.TXT", WJournal)

RETOUR

-=-=-=-

Contenu de FJOURNAL.TXT :

Origine :N:WD9ProjetsStockExetraceLicences Destinataire
:N:WD9ProjetsStockExetracesmtp

Le répertoire a été copié
-=-=-=-

Seul différence je suis en WD9 mais si tu testes le code en l'état as-tu
toujours ton soucis ?


Amicalement,

Emmanuel Haefelé.
Avatar
Georges Peyre
Bonjour

Emmanuel Haefele a formulé ce mercredi :

Seul différence je suis en WD9 mais si tu testes le code en l'état as-tu
toujours ton soucis ?



Oui le problème est entier :

C'est très net ...

si j'appelle directement CopieFichier la copie et l'écriture du fichier
Journal se font correctement

si j'appelle la copie par :
ThreadExécute ( "test", threadNormal, CopieFichier )
La copie s'exécute et l'écriture du journal ne se fait pas

Mystères de Windev 10 !!!

Cordialement

--
Elle est pas belle la vie ?
Avatar
Emmanuel Haefele
"Georges Peyre" a écrit

Mystères de Windev 10 !!!



Bizarre car suite à ta réponse j'ai testé en 10 chez moi et ça fonctionne
toujours (version 37f) !


Amicalement,

Emmanuel Haefelé.
Avatar
Georges Peyre
Bonjour

Emmanuel Haefele a exposé le 14/09/2006 :

Bizarre car suite à ta réponse j'ai testé en 10 chez moi et ça fonctionne
toujours (version 37f) !



Tu as raison car je me suis piégé totalement avec l'utilisation de la
procédure CopieFichier.

Je lance la copie à partir d'une fenêtre particulière.

J'ai fais la bétise de placer CopieFichier dans la Procédure locale de
cette fenêtre.

Hors dans le bouton qui lance la copie, le ThreadExecute est suivi de
la fermeture immédiate de la fenêtre.

J'ai donc mis CopieFichier dans les procédures globales et lorsque la
fenêtre est fermée la procédure CopieFichier continue à s'exécuter.

C'est aussi con que celà ( et que moi )

Merci infiniment pour ton aide

Cordialement


--
Elle est pas belle la vie ?