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
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 ;)
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
// 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 ?
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
// 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.
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
// 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 ?
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é.
"Georges Peyre" <grand.pere@orange.fr> 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 ?
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é.
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
L'écriture du jounal ne se fait pas non plus : est-ce aussi une impossibilité du thread ?
-- Elle est pas belle la vie ?
Bonsoir Emmanuel
Emmanuel Haefele a écrit :
"Georges Peyre" <grand.pere@orange.fr> 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
"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