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

Threads & Processus C++ Discussion :

Alternative à la fonction Sleep()


Sujet :

Threads & Processus C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut Alternative à la fonction Sleep()
    Bonjour,

    Je réalise actuellement une application utilisant les MFC (sous Windows Xp). Mon application doit traiter des images en temps réel. Bref, mon application nécéssite plusieurs threads qui communiquent entre eux.

    J'ai un thread qui doit attendre la fin de plusieurs autres avant de pouvoir continuer. Pour cela j'ai une variable globale égale au nombre de threads dans ma classe qui manage ces threads. Une fois que chacun des threads à fini son traitement il décrémente la variable. Quand celle ci est égale à 0 le traitement peut continuer.

    Pour vérifier la valeur de la variable, le thread de management possede une boucle qui va vérifier à interval régulier la valeur. Un code du genre :

    While(Maclasse::NombreDeThreadLance!=0);

    Problème : la ca me bouffe toutes mes ressources CPU

    Ok j'ajoute un Sleep :
    While(Maclasse::NombreDeThreadLance!=0)Sleep(1);

    Problème : Sleep(1) ne fait non pas dormir le process 1ms comme demandé mais 15ms ce qui n'est pas acceptable pour du traitement d'images en temps réelle.

    La queston est : Existe il une fonction équivalante à Sleep(int) permettant de mettre en pause un process pour un temps d'environ 1ms?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Problème typique de programmation multi thread.

    En changeant ton architecture, tu peux imaginer un sémaphore pris par chacun des thread écrivain. et le thread lecteur qui tente de prendre ce sémaphore quand tant que tous les écrivains n'ont pas fini.

    L'attente sur le le sémaphore sera bloquante mais ne consommera pas de temps CPU.

    Après suivant ton OS, il faut voir les sémaphores et les primitives que tu peux utiliser. Tu peux déjà regarder ici pour la théorie.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par --flow-- Voir le message
    J'ai un thread qui doit attendre la fin de plusieurs autres avant de pouvoir continuer. Pour cela j'ai une variable globale égale au nombre de threads dans ma classe qui manage ces threads. Une fois que chacun des threads à fini son traitement il décrémente la variable. Quand celle ci est égale à 0 le traitement peut continuer.
    Salut,
    Comme le dit Ram, ceci est plus ou moins la définition d'un sémaphore. Avec les MFC c'est un CSemaphore (doc MSDN sur les MFC&thread).

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Ok merci du tuyau , je vais regarder de ce coté la.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Et avec des API comme boost.thread, tu as directement moyen d'écrire que tu attends qu'un groupe de thread soit terminé.

    Et pour info, avec les threads natifs windows, tu as aussi moyen, sans créer toi même un semaphore, d'attendre qu'un thread soit fini. En effet, un handle de thread est autorisé pour un WaitFor[Single/Multiple]Object[s], et attend la fin du thread en question. Tu dois avoir moyen de récupérer un tel handle au moment où tu crées ton thread (je ne connais pas les MFC, donc je ne sais pas comment faire).

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Ok merci pour la réponse JolyLoic.

    En réalité je n'ai pas besoin d'attendre la fin de mon thread car je ne lance pas plusieurs nouveaux threads pour chaque image à traiter. J'en lance une fois pour toute autant que j'ai de processeurs sur la machine. Ensuite je leur donne l'image à traité,chacun traite un fragment de l'image. C'est la que j'ai besoin de savoir quand mes threads ont fini leurs traitement histoire de leurs passé le plus rapidement possible l'image suivante. Donc au final ils tournent en boucle.

    Par contre je vais regarder les possibilités de Boost et me chercher un tuto sur les Sémaphores . Avec tout ca j'espère que je vais y arriver tout de même

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par --flow-- Voir le message
    Ok merci pour la réponse JolyLoic.

    En réalité je n'ai pas besoin d'attendre la fin de mon thread car je ne lance pas plusieurs nouveaux threads pour chaque image à traiter. J'en lance une fois pour toute autant que j'ai de processeurs sur la machine. Ensuite je leur donne l'image à traité,chacun traite un fragment de l'image. C'est la que j'ai besoin de savoir quand mes threads ont fini leurs traitement histoire de leurs passé le plus rapidement possible l'image suivante. Donc au final ils tournent en boucle.

    Par contre je vais regarder les possibilités de Boost et me chercher un tuto sur les Sémaphores . Avec tout ca j'espère que je vais y arriver tout de même
    Salut,
    Sur boost, tu trouveras le tuto les threads de Boost de Matthieu Brucher.

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    A titre anecdotique, une version très proche de la lib des threads de boost sera intégrée à C++0x. Tu peux déjà les retrouver ici : http://www.stdthread.co.uk/

    Un bouquin sur le sujet devrait bientôt paraître

  9. #9
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Pour l'instant j'ai testé avec un CMultiLock pour me permettre d'attendre la fin de tous mes threads. Je viens de tester les performances et effectivement c'est beaucoup mieux. J'ai plus de temps de latence entre la fin de mes threads et le moment ou mon thread principale prends le relai. Et niveau ressources CPU utilisées ca à l'aire bien.

    Pour l'instant j'ai pas encore intégré ca à mon Projet, j'ai juste fait un test, mais je penses que ca devrait rouler. Merci à tous vous m'avez bien aidés!


  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Attention à la grammaire :
    • J'ai plus de latence il y a de la latence supplémentaire
    • Je n'ai plus de latence la latence a disparu

    Cela s'écrit presque pareil mais ce n'est pas du tout le même sens.

    Je suppose que tu as voulu écrire Je n'ai plus de latence

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Réponse B en effet :
    Je n'ai plus de latence => la latence a disparu

    Désolé, merci pour la remarque, le pire c'est que j'ai déjà fait plusieurs fois cette même remarque à d'autre personnes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une alternative a la fonction sleep
    Par fresh13 dans le forum C++
    Réponses: 5
    Dernier message: 09/03/2011, 23h23
  2. [PHP-JS] Alternative à la fonction sleep();
    Par Betelgeuse dans le forum Langage
    Réponses: 5
    Dernier message: 24/09/2007, 11h34
  3. cherche alternative à la fonction Sleep()
    Par anthracite dans le forum C++
    Réponses: 7
    Dernier message: 26/10/2005, 17h07
  4. [VB.NET] Fonction sleep
    Par Dnx dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/02/2005, 16h31
  5. [langage] fonction sleep + probleme fenetre dos
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2003, 20h46

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