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

Windows Discussion :

[win32] threads, suspension et reprise


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut [win32] threads, suspension et reprise
    bonjour,

    je suis confronté à un problème. J'ai une tâche exécutée par un thread qui fonctionne de la facon suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (1) {
          Sleep(2000); // endormir le thread pendant 2000 ms
         
          mutex.Lock();
    
          // executer toutes les taches de ma liste s'il y en a
         
          while (GetNextCommand(cmd)) {
              cmd.Execute();         
          }
    
          mutex.Unlock();      
    }

    Toutes les 2 secondes, le thread va donc voir s'il y a des tâches a executer dans une liste. Jusque la, tout va bien.

    Par contre, il est possible d'ajouter d'autres tâches à effectuer à n'importe quel moment (par exemple lorsqu'on appuie sur un bouton). Le problème est qu'il faudrait que je réveille mon thread sans attendre la fin du Sleep(2000)

    Et je n'ai pas trouvé de mécanisme pour faire ca sous windows. En effet, la fonction ResumeThread() fonctionne avec la fonction SuspendThread() qui ne fait qu'incrémenter/décrémenter un compteur de suspension sans notion de temps. Il y a bien la fonction WaitForSingleObject que je peux appeler sur mon handle de thread avec un temps , ce qui revient à faire un Sleep, mais je ne vois pas comment signaler mon thread pour qu'il sorte du WaitForSingleObject.



    Merci d'avance pour vos réponses :jap:

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    CreateEvent()
    SetEvent()
    ResetEvent()

    et WaitForSingleObject()

    (sans oublier un CloseHandle() quand tu as fini de jouer avec l'Event)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    merci je vais tester ca

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Tu peux attendre pour plusieurs évènements en même temps avec WaitForMultipleObjects. Mais pas besoin dans ton cas je pense. Il faut te passer du Sleep, avec un Event par exemple comme le suggère Médinoc.
    Pour ma part je verrai bien GetNextCommand se comporter comme GetMessage. Elle est bloquante tant qu'il y a rien, et c'est elle en interne qui gère le Mutex, si c'est possible.
    Quant à SuspendThread/ResumeThread, il ne faut pas les utiliser.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Tu peux attendre pour plusieurs évènements en même temps avec WaitForMultipleObjects. Mais pas besoin dans ton cas je pense. Il faut te passer du Sleep, avec un Event par exemple comme le suggère Médinoc.
    Pour ma part je verrai bien GetNextCommand se comporter comme GetMessage. Elle est bloquante tant qu'il y a rien, et c'est elle en interne qui gère le Mutex, si c'est possible.
    Quant à SuspendThread/ResumeThread, il ne faut pas les utiliser.
    le petit souci est que je dois egalement implémenter ca sous linux (mais je ne suis plus dans la bonne section) et comme ce n'est pas tout a fait les memes mécanismes, il faut que j'adapte mon code pour qu'il fonctionne dans les 2 cas.

    Cependant , ton idée est bonne (le fait de rendre GetNextMessage bloquante), car le comportement est assez similaire à la boucle d'événement de windows.

    Merci des conseils en tout cas

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Alors je te conseille ne pas utiliser Win32 mais une lib qui encapsule tout ça. Ainsi, le même code compilera sous Linux & Windows (boost, pthread, ACE, Qt, wxWidgets, ...).

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Alors je te conseille ne pas utiliser Win32 mais une lib qui encapsule tout ça. Ainsi, le même code compilera sous Linux & Windows (boost, pthread, ACE, Qt, wxWidgets, ...).
    je ne savais pas qu'il y avait une implémentation des pthreads sous windows.

    Je vais tenter d'adapter mon code pour les utiliser.

    Par contre, dans quelle section du forum dois-je poster pour avoir une réponse à la question que j'ai initialement posée, mais en utilisant cette fois-ci non pas WIN32 mais pthread ?

    merci beaucoup

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    C'est surtout un problème d'algo je pense. Pour les pthread, tu peux poser sur le forum Linux quand tu écris ton code Linux. Si c'est au portage Win32, ici ça reste le mieux je pense.
    Pour les lib C++, le forum C++ peut convenir.

Discussions similaires

  1. Suspension et reprise d'exécution
    Par Vorillyan dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/08/2008, 11h40
  2. Threads : pause et reprise avec JButton
    Par bioinfx6996 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/04/2008, 16h39
  3. suspension pui reprise d'une boucle for
    Par rabddoul dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/05/2007, 21h07
  4. Réponses: 2
    Dernier message: 21/05/2007, 15h09
  5. Réponses: 2
    Dernier message: 05/03/2007, 16h45

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