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 :

Impossible d'arrêter un thread


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut Impossible d'arrêter un thread
    Bonjour à tous !

    Là, il y a quelque chose qui m'échappe. J’exécute la fonction ThreadExécute() avec tout ce qui va bien dedans ... jusque là pas de problème, le code s’exécute correctement en revanche lorsque je demande au thread de s'arrêter via la fonction ThreadArrête() il ne se passe rien je reste bloqué sur la fonction malgré lui avoir donné un temps.

    Ça marché très bien avant et plus maintenant, j'ai redémarré le PC etc et rien n'y fait.

    Avez-vous une idée ou solution à mon problème ?

    Merci d'avance à tous.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'ai eu moi aussi affaire à la gestion des threads un peu spéciale de PC soft.

    Déjà, il faudrait que je saches : que fais-tu comme traitements dans ton thread?
    Si tu fais des requêtes ou des accès fichier sur une BDD et que cette requête prend un peu de temps, alors ça ne m'étonne pas que tu n'arrives pas à arrêter ton thread.

    En effet, il suffit qu'une fonction wlangage prenne beaucoup de temps (et non pas une procédure utilisateur, nuance!) et ça peut en effet empêcher l'arrêt d'un thread.

    L'astuce dans ce cas consiste à appeler un autre thread dans le thread et d'attendre la fin du "sous-thread" à partir du thread appelant, de la manière suivante dans la fonction du Thread:

    Code wlangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ThreadExécute(sMonThread,threadNormal,proFAppelTraitementAsynchrone)
    TANTQUE ThreadEtat(sMonThread)<>threadInexistant alors
       ThreadPause(50)
    FIN

    Ainsi, le thread principal n'est pas bloqué si tu essaies de l'arrêter. Seul le sous-thread continuera de tourner mais tant pis pour lui!

    Chose intéressante : dans la version 19, PC soft a rajouté une fonction "ThreadFin" pour forcer l'arrêt du thread... Comme quoi, il y avait vraiment un problème dans leur gestion des threads!
    [EDIT] Ah je viens de voir dans la doc de PC soft qu'en fait la fonction "ThreadFin" c'est ni plus ni moins que ThreadArrête("")... Leur gestion des threads est une vraie calamité...
    Dernière modification par Invité ; 11/12/2013 à 10h24.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut
    Bonjour Ph_Gr,

    Tout d'abord merci de ton aide et de ta réponse, je me sers du thread pour exécuter du code w-langage dans la récupération de fichiers sur un serveur FTP.

    Cela m'évite de bloquer mon appli pendant le téléchargement, à la fin de celui-ci je souhaite afficher un message à l'utilisateur pour lui demander d'installer ou non la MAJ mais ça ne fonctionne pas car je suis bloqué par la tentative d'arrêt du thread.

    J'utilise FTPConnect() avant le thread et si c'est Ok, je fais un FTPRécupère() à la fin du téléchargement qui peu durée plusieurs minutes selon le débit utilisateur, je fais un FTPDéconnecte() et ensuite un ThreadArrete().

    A titre d'information :
    J'ai mis en commentaire la section de téléchargement (c'est trop long d'attendre à chaque qu'il est fini de télécharger pour avoir le ThreadArrête().
    J'arrive donc instantanément sur l'arrêt du Thread qui ne fonctionne toujours pas !

    Effectivement la gestion des Threads à l'air d'être une vraie calamité !!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Jb_One73 Voir le message
    je me sers du thread pour exécuter du code w-langage dans la récupération de fichiers sur un serveur FTP.

    Cela m'évite de bloquer mon appli pendant le téléchargement, à la fin de celui-ci je souhaite afficher un message à l'utilisateur pour lui demander d'installer ou non la MAJ mais ça ne fonctionne pas car je suis bloqué par la tentative d'arrêt du thread.
    Oui, c'est logique, c'est tout à fait le contexte pour lequel il faut utiliser des threads normalement.

    Citation Envoyé par Jb_One73 Voir le message
    J'utilise FTPConnect() avant le thread et si c'est Ok, je fais un FTPRécupère() à la fin du téléchargement qui peu durée plusieurs minutes selon le débit utilisateur, je fais un FTPDéconnecte() et ensuite un ThreadArrete().

    A titre d'information :
    J'ai mis en commentaire la section de téléchargement (c'est trop long d'attendre à chaque qu'il est fini de télécharger pour avoir le ThreadArrête().
    J'arrive donc instantanément sur l'arrêt du Thread qui ne fonctionne toujours pas !
    C'est bizarre, j'aurais dit qu'en fait c'est la fonction "FTPRécupère" qui prend du temps et qui empêche le thread de s'arrêter. C'est la seule chose qui peut l'empêcher de s'arrêter. Normalement, le thread s'arrête dès qu'il sort de la fonction dans le thread, s'il a passé le ftpdéconnecte, il n'est absolument plus nécessaire d'arrêter le thread.

    Les symptômes d'un thread qui ne s'arrête pas sont normalement :
    - La fonction "threadetat(sNomThread)" renvoie autre chose que "ThreadInexistant" (où "sNomThread" est le nom du Thread)
    - L'appel à "ThreadArrête" bloque complètement

    si tu n'as pas ces 2 symptômes, c'est que ton thread est déjà arrêté. As-tu vérifié tout cela?
    Peux-tu me montrer un peu de code pour voir comment tu t'y prends?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut
    Pour répondre à tes 2 questions :
    - J'ai bien utilisé la fonction ThreadEtat qui me dit que mon Thread est bien existant.
    - Le bloquage se fait sur la fonction ThreadArrête(), en mode débogage je n'arrive pas à passer au traitement suivant.

    Je me suis dit, tant pis je ne supprime pas le thread (je met rien) mais impossible d'afficher une boite de dialogue si le thread n'est pas détruit, en revanche une fenêtre système appeler avec la fonction Info() fonctionne correctement.

    A y perdre son latin !!! Thread et Windev ne fait pas bon ménage

  6. #6
    Invité
    Invité(e)
    Par défaut
    Peux-tu me montrer un bout de code pour que je vois?

Discussions similaires

  1. Arrêter un thread en python ?
    Par fanou31 dans le forum Général Python
    Réponses: 7
    Dernier message: 23/06/2013, 18h15
  2. Réponses: 2
    Dernier message: 05/10/2006, 17h56
  3. [Thread] arrêter un thread
    Par melvar dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/04/2006, 18h06
  4. Réponses: 18
    Dernier message: 06/04/2005, 14h09
  5. Arrêter une Thread brutalement!
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 21h29

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