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

MFC Discussion :

Comment suspendre un worker thread?


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut Comment suspendre un worker thread?
    Bonjour j'ai créé un thread de travail (lancé par la fonction AfxBeginThread) et je souhaite mettre une pause à son exécution. Comment peut on faire?
    Merci d'avance

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Le forum "Visual C++" aurait été plus adapté à ta question.

    Fonction SuspendThread de l'API Win32, ou CWinThread::SuspendThread suivant le cas.
    Tu peux les appeler aussi bien depuis le thread lui-même que depuis un autre thread.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Cela aura t il pour effet d'arrêter le thread ou peut on le faire repartir à notre gré?
    Est ce qu'on pourrait faire pareil avec des Event, on fait attendre un event qui est lancé quand on relance le thread?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    oui
    une fois suspendu le thread peut redemarrer avec ResumeThread.
    oui tu peux bloquer ton thread avec un event.
    exemple d'utilisation d'event dans la faq:
    http://c.developpez.com/faq/vc/?page...opWorkerThread

    regarder aussi l'utilisation d'un event pour la reception de données par voie serie. (voir lien dans le post cite)
    le thread est bloqué tant que l'on ne recoit pas de caracteres..

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Pour rajouter un "grain de sel" : suspendre un thread par SuspendThread est relativement "brutal", car il s'arrête là où il est, et surtout quoi qu'il soit en train de faire !!

    Bref, tout va bien si le travail effectué par le thread est indépendant d'une quelconque ressource externe (ex : thread de calcul "pur", compression, cryptage, etc...), et que le "top finish" est donné par la fin du thread lui-même. Dans ce cas, ça ne fait que ralentir la complétion du travail, c'est tout.

    Si, par contre, ton thread ne peut/doit être arrêté qu'à certains endroits bien précis, alors un évènement est indispensable car c'est le seul moyen de ne l'interrompre qu'à certains endroits prédéterminés : le "truc", c'est à chaque fois d'attendre un évènement avec un timeout infini, cet évènement étant par défaut toujours signalé et "manuel". Si le thread principal "annule" l'évènement, le(s) thread(s) correspondant(s) sera(ont) suspendu(s) après complétion de l'"atome" de calcul en cours. Il(s) repartira(ont) dès que le thread principal aura de nouveau signalé l'évènement.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    En fait j'ai une série d'images en mémoire dans une liste chaînée et je souhaite pouvoir les lire et faire des fonctions de magnétoscope.
    Je souhaite pouvoir lire la séquence d'une traite ou bien de pouvoir faire une pause ou faire revenir en arrière ou image par image. J'ai vu les exemples sur le FAQ Visual C++ notamment celui du programme de service
    J'ai vu aussi que tu pouvais faire un WaitForSingleObject sur un Thread est ce que cela peut marcher avec les fonctions SuspendThread et ResumeThread?
    Si ma fonction de thread est en attente d'une action, elle va se suspendre elle même et attendre que l'utilisateur presse le bouton pour attendre le ResumeThread.

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Mastero
    En fait j'ai une série d'images en mémoire dans une liste chaînée et je souhaite pouvoir les lire et faire des fonctions de magnétoscope.
    Donc, les évènements sont à priori préférables pour toi, car tu dois faire tes pauses "frame par frame", et avoir fini d'en décoder une pour pouvoir te mettre en "pause" de manière saine.

    Citation Envoyé par Mastero
    J'ai vu aussi que tu pouvais faire un WaitForSingleObject sur un Thread est ce que cela peut marcher avec les fonctions SuspendThread et ResumeThread?
    Non, WFSO sur un thread, c'est pour attendre la terminaison du thread, pas le fait d'attendre qu'il soit suspendu.

    Citation Envoyé par Mastero
    Si ma fonction de thread est en attente d'une action, elle va se suspendre elle même et attendre que l'utilisateur presse le bouton pour attendre le ResumeThread.
    C'est ce que fait WFSO : il attend "quelque chose", la nature de l'attente dépendant de la nature du handle passé en paramètre.
    Pour un évènement, ça attend qu'il soit signalé. Pour un thread ou un processus, ça attend la fin du thread/processus. Pour un mutex, ça attend qu'il soit libre et ça le prend au passage (idem pour les sémaphores). Etc, etc, etc.
    En fait, un WFSO "en attente", avec un timeout infini par exemple, est exactement équivalent à un SuspendThread, mais à "Resume automatique"... Avec les fonctions SuspendThread/ResumeThread, il faut qu'un AUTRE thread gère le contrôle, au moins pour le ResumeThread en tout cas !!

    Est-ce un peu plus clair pour toi ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Une question pour confirmation, est ce qu'à chaque reception d'un SetEvent on doit faire un ResetEvent?

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Si l'évènement est "manuel" (paramètre bManualReset==TRUE), oui, sinon c'est automatique.
    Tu décides ça à la création de l'event, cf. CreateEvent sur MSDN.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/04/2008, 19h00
  2. Réponses: 1
    Dernier message: 16/01/2006, 10h15
  3. [C# 2.0][Form]Comment utiliser les Delegates & Threading
    Par Tips dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/01/2006, 14h22
  4. [C#] Comment suspendre le click durant un traitement ?
    Par sorcer1 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 15h05

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