IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Procédure automatique et Thread


Sujet :

WinDev

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Procédure automatique et Thread
    Bonjour,
    Pour mon travail je suis en train de développer une petite appli qui me permet de "monitorer" une interface entre 2 logiciels.

    J'ai une procédure automatique (toute les 10s en thread) qui se lance automatiquement avec ma fenêtre principale. Cette procédure va compter le nombre de fichier dans un dossier sur un serveur via un lien réseau du style \\serveur\partage.

    Le problème c'est qu'il met entre 5 et 10 secondes à compter et qu'il me bloque ma fenetre principale le temps de l'éxecution alors qu'il ne devrai pas. Je n'ai peut être pas tout compris au thread :X

    Voici le code de ma procédure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCEDURE CRADM()
    IMG_loading..Opacité=100
    Old_nbfic = nBfic
    ResListeFichier est une chaîne
    ResListeFichier = fListeFichier(INILit("config","emplacement_cradm","","./config.ini")+"\*.xml", frNonRécursif)
    nBfic = ChaîneOccurrence(ResListeFichier,RC) +1 
    SI nBfic > Old_nbfic ALORS
    	IMG_up ="./IOS18820c.png"
    SINON
    	IMG_up="./IOS18820a.png"
    FIN
    LIB_CRADM= "CRADM: " + nBfic
    LIB_update="Dernier update: "+HeureVersChaîne(HeureSys(),"HH:MM:SS")
    IMG_loading..Opacité=00
    Voyez vous des erreurs dans mon code ?
    Merci d'avance de votre aide

  2. #2
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonsoir,

    Tu la lance comment cette procédure ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour damda58 et WDKyle,

    Citation Envoyé par WDKyle Voir le message
    Tu la lance comment cette procédure ?
    Dans le titre et le premier message, il est question d'une procédure automatique avec Thread.

    Le problème avec fListeFichier() c'est qu'il ne te rend pas la main.

    Une première idée: (un peu bof )

    Utiliser la version de fListeFichier avec procédure.
    "Liste les fichiers d'un répertoire en appelant une procédure pour chaque fichier"
    Et dans la procédure en question, exécuter un Multitâche(-1)

    Mais il n'est pas certain que ce soit efficace, surtout si fListeFichier récupère un petit nombre de fichiers.
    (tout dépend de la façon dont la liste des fichiers est récupérée à travers le réseau).

    Deuxième idée: (un peu moins pire )

    Ne pas déclarer la procédure comme étant automatique et à la place créer toi-même le thread qui exécute la procédure grâce à la fonction ThreadExécute.
    Tu ajoutes en début de procédure ThreadPause.

    Juste pour voir si le principe fonctionne...

  4. #4
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    Deuxième idée: (un peu moins pire )

    Ne pas déclarer la procédure comme étant automatique et à la place créer toi-même le thread qui exécute la procédure grâce à la fonction ThreadExécute.
    Tu ajoutes en début de procédure ThreadPause.

    Juste pour voir si le principe fonctionne...
    +1

  5. #5
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Bonjour,

    J'ai testé fListeFichier dans une procédure automatique en tâche de fond et ça ne bloque pas.
    Le reste de la fonction ne devrait pas bloquer non plus, mais normalement il ne faut pas accéder à l'IHM depuis un thread secondaire.

    Etes-vous certain d'avoir coché "Exécution en tâche de fond" ?
    Pour vérifier que votre code est dans un thread secondaire il suffit de vérifier que ThreadCourant() renvoie une chaîne non vide.

    En se passant de la procédure automatique, voici comment je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROCEDURE CRADM()
    sListeFichiers est chaîne
     
    TANTQUE PAS ThreadAttendSignal(50) // 5s avant chaque mise à jour
        ExécuteThreadPrincipal(AfficheLoading)
        sListeFichiers = fListeFichier(INILit("config", "emplacement_cradm", "", "./config.ini") + "\*.xml", frNonRécursif)
        ExécuteThreadPrincipal(RafraîchitIHM, ChaîneOccurrence(sListeFichiers, RC) + 1)
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE AfficheLoading()
    IMG_loading..Opacité = 100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PROCEDURE RafraîchitIHM(LOCAL nBfic est entier)
    SI nBfic > Old_nbfic ALORS
    	IMG_up = "./IOS18820c.png"
    SINON
    	IMG_up = "./IOS18820a.png"
    FIN
    Old_nbfic = nBfic
    LIB_CRADM = "CRADM: " + nBfic
    LIB_update = "Dernier update: " + HeureVersChaîne(HeureSys(), "HH:MM:SS")
    IMG_loading..Opacité = 0
    Pour démarrer le thread vous faites un ThreadExécute().
    Pour arrêter le thread, vous faites un ThreadEnvoieSignal().

    ThreadAttendSignal
    ThreadExécute
    ExécuteThreadPrincipal
    SectionCritiqueDébut


    PS. Je viens de voir qu'il y a une différence entre WD17 et WD18. Il semblerait qu'on ne puisse pas combiner "espacer les appels" avec "exécution en tâche de fond".

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    D'abord merci de prendre un peu de temps pour moi !

    @WDKyle => Elle se lance toute seule en Thread a l'ouverture du projet (Paramétrer les automatisme de la procédure)

    @Onepoint => 1ere idée: je ne trouve pas le listefichier avec procédure
    2eme idée: ça ne fonctionne pas non plus :/

    @Hibernatus34 => Quand je lance l'appli directement sur le serveur il compte beaucoup plus vite vu qu'il liste un chemin local et donc le problème est a peine perceptible.

    J'ai essayer ton code mais la fonction executethredprincipal n'a pas l'air reconnu :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Erreur :Identificateur 'ExécuteThreadPrincipal' inconnu ou inaccessible.
    il n'y a pas d'autre solution pour compter le nombre de fichier présent dans un dossier ?

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Bonjour,

    quel est le temps d'affichage dans ton explorateur (à la louche car ça peut être très rapide) ?

    la fonction FListeFichier devrait faire partie du Thread si tu ne veux pas qu'elle te pénalise.

    à bientôt,

    Nicolas

  8. #8
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    dans l'explorateur windows depuis le serveur il met dans les 5s avant de tout afficher ( actuellement il y a plus de 10 000 fichiers)
    toujours dans l'explorateur mais depuis un poste via le reseau il met 6-7s
    via fliste sur le serveur 2-3 s
    via fliste sur un poste 25s :/

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    As-tu essayé en changeant le répertoire courant par celui où sont les fichiers ? Ensuite tu lances la fonction sur \*.xml uniquement sans indiquer de répertoire.

  10. #10
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je viens de tester et ça fait la même chose

  11. #11
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    damda58: Si vous êtes vraiment dans WD17, ExécuteThreadPrincipal existe.
    Sinon, vous pouvez remplacer mes appels à ExécuteThreadPrincipal par des appels directs aux 2 autres fonctions pour commencer (AfficheLoading et RafraîchitIHM).

    Le ExécuteThreadPrincipal c'est pour éviter d'accéder à l'IHM depuis un thread secondaire.

    Juste en passant, appelez ThreadMode(threadSectionCritique) dans le code d'init du projet. Par défaut WinDev fait de la synchro à la fonction, ce qui est inutile 99,999...% du temps et peut causer des blocages inutiles.
    Mais ça n'est probablement pas lié à votre problème.

  12. #12
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    oui je suis en W17 V17.0.142.0
    le ThreadMode(threadSectionCritique) j'avais déjà mis.
    Je vois pas comment faire

  13. #13
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Déjà mettez WD17 à jour, votre version est ancienne.
    http://pcsoft.fr/st/telec/windev17/index.html

    Ensuite, avez-vous vérifié que fListeFichier était bien appelé dans un thread ?
    Je rappelle que vous pouvez le vérifier avec ThreadCourant : Trace(ThreadCourant() <> "" ? "Thread secondaire" SINON "Thread principal")

  14. #14
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Il faudrait que je le mette à jour oui.
    J'ai testé et le liste fichier fait bien parti d'un thread que j'ai nommé "actu"

  15. #15
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Là je ne comprends plus.
    Vous parliez d'une procédure automatique. Leurs threads ont un nom du genre "Automatique - 001".
    Mais commencez par vous mettre à jour, oui.

  16. #16
    Candidat au Club
    Homme Profil pro
    Technicien Supérieur Hospitalier en informatique
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Technicien Supérieur Hospitalier en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui je me suis trompé il s'apelle THREAD0
    Pour les mises à jour pour l'instant j'ai un soucis windev plante quand j'ouvre mon projet mais tout refonctionne quand j'enlève la Maj

  17. #17
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Dans la liste des téléchargements il y a un correctif.
    Essayez de l'installer aussi.
    http://www.pcsoft.fr/st/telec/module..._78n.htm#TELEC
    "Correctif développement sous XP"

Discussions similaires

  1. [WD17] Réaliser une procédure automatique
    Par karim15 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/04/2013, 09h44
  2. Réponses: 1
    Dernier message: 19/04/2013, 10h55
  3. Lancer une procédure automatiquement
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 7
    Dernier message: 03/03/2010, 12h37
  4. Réponses: 14
    Dernier message: 04/06/2007, 22h43
  5. [PHP MySQL] procédure automatique chaque jour a telle heure
    Par Therambok dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/06/2006, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo