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 :

Executer deux fonctions en même temps


Sujet :

Threads & Processus C++

  1. #1
    Invité
    Invité(e)
    Par défaut Executer deux fonctions en même temps
    Salut tout le monde
    Je viens demander conseils sur ce forum pour un petit problème. Je souhaiterais que deux fonctions s'exécutent en même temps. Je pense qu'il faut utiliser le multithreading mais le problème c'est que je ne m'y connais pas trop la-dedans, si vous pouvez m'aider
    Merci d'avance

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Utiliser un thread ( ou deux ) permetra d'executer plusieur fonctions en même temps.
    Tu es sur quel système?

    Sous linux je connais les threads posix qui se font avec fork().
    Sous windows je connais moins, mais je suis sur que pour les deux systèmes tu trouvera de la doc sur ce site.

    Par contre, faire un thread, implique qu'il faut faire une gestion de cas qu'on ne trouve pas lors d'un programme monothread.
    Par exemple , un des cas possible c'est que les deux threads veulent accéder en écriture au même fichier. Pour régler ce problème, on bloc l'accès du fichier au deuxième thread en utilisant un sémaphore ( ou autre mutex ), qui sera partageait par les deux threads, pour renseigner sur la disponibilité de la ressource.
    ( Je suis aussi sur que tu trouvera de plus ample explication des les différentes pages du site )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    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 367
    Points
    50 367
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Sous linux je connais les threads posix qui se font avec fork().
    Attention, fork() ne créé pas un thread, cela créé un nouveau process.

    Un thread est une unité d'exécution à l'intérieur d'un process. Toutes les variables globales du process sont visibles par tous les thread du process. Tous l'espace mémoire du process est accessible par le thread.

    fork() va créer un nouveau process avec une copie de l'espace mémoire tel qu'il est au moment du fork().
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    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 pitt77 Voir le message
    Je viens demander conseils sur ce forum pour un petit problème. Je souhaiterais que deux fonctions s'exécutent en même temps. Je pense qu'il faut utiliser le multithreading mais le problème c'est que je ne m'y connais pas trop la-dedans, si vous pouvez m'aider
    Attention toutefois : exécuter deux fonctions réellement en même temps impose d'avoir deux cœurs... Sinon, une seule des deux s'exécutera, et elle basculeront de l'une à l'autre toutes les 20 ms environ (ce qui ne t'aidera pas beaucoup si elles s'exécutent en moins de temps que ça !!).

    Si par contre tu as une fonction dédiée par exemple à la gestion des entrées utilisateur et l'autre en attente d'un évènement quelconque (arrivée de données par une socket, transfert depuis/vers le disque, etc.), alors par contre même sur un seul cœur tu auras un gain de performances intéressant.

    Il faudrait que l'on sache sur quel système tu travailles, ainsi que ton compilateur, de façon à pouvoir t'orienter vers des solutions adéquates.

    Citation Envoyé par ram-0000 Voir le message
    Attention, fork() ne créé pas un thread, cela créé un nouveau process.
    Je confirme, et ça n'a du coup plus rien à voir avec un thread, notamment à cause de l'isolation de la mémoire entre deux processus.
    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

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses
    En fait ce que je voudrais faire c'est exécuter une fonction attendre quelque chose tout en continuant à utiliser le programme, en ce moment dès que je mets la fonction attendre mon programme se bloque car c'est la fonction attendre qui est exécutée.

    EDIT : Je suis sous windows vista (mais je souhaite faire un code portable), j'utilise Code::Blocks avec le compilateur MinGW.

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Juste pour clarifier ce que tu cherches : Tu veux lancer une fonction en "parallèle" de ton programme (si je puis m'exprimer ainsi!) qui attend un évenement provoquer par le programme principal pour executer une action?

    Si c'est effectivement ça, il faut en effet chercher du côté des threads.

  7. #7
    Invité
    Invité(e)
    Par défaut
    En gros ce que je souhaite c'est une sorte d'option dans mon programme qui empêche la mise en veille, pour ça j'appelle la fonction SetThreadExecutionState mais il faut que je l'appelle periodiquement donc toutes les 55 secondes j'appelle la fonction mais cela bloque mon programme qui reste bloqué dans la boucle "appeller fonction; attendre 55s"

  8. #8
    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 pitt77 Voir le message
    En fait ce que je voudrais faire c'est exécuter une fonction attendre quelque chose tout en continuant à utiliser le programme, en ce moment dès que je mets la fonction attendre mon programme se bloque car c'est la fonction attendre qui est exécutée.
    C'est effectivement une utilisation correcte d'un thread, y compris sur un système à un seul cœur.

    Citation Envoyé par pitt77 Voir le message
    EDIT : Je suis sous windows vista (mais je souhaite faire un code portable), j'utilise Code::Blocks avec le compilateur MinGW.
    Code portable ? Avec des threads ? Pas gagné d'avance, ça... Tu vas être obligé de passer par une librairie d'abstraction afin d'avoir la même interface entre le monde Windows et le monde Unix/Linux.

    Le choix est (heureusement !) vaste, mais de là à dire quelle est la meilleure... J'aurais tendance à dire "celle déjà disponible avec ton framework", mais ça te rend alors dépendant d'un framework donné (ex : QT).

    Pour l'utilisation d'une librairie "limitée" à la seule gestion des threads, tu peux là aussi t'exposer à des soucis de portabilité car tu n'auras pas accès à d'autres systèmes que ceux supportés par la librairie en question.

    Après, parmi les choix possibles de librairies supportant un système de threads portable, tu as : Boost, ACE, POCO, Win32 Pthreads, et j'en oublie des tonnes et des tonnes...
    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

  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
    Citation Envoyé par pitt77 Voir le message
    En gros ce que je souhaite c'est une sorte d'option dans mon programme qui empêche la mise en veille, pour ça j'appelle la fonction SetThreadExecutionState mais il faut que je l'appelle periodiquement donc toutes les 55 secondes j'appelle la fonction mais cela bloque mon programme qui reste bloqué dans la boucle "appeller fonction; attendre 55s"
    Ça, par contre, ce n'est aucunement portable, c'est spécifique Windows...

    Et je crois bien qu'il existe une API Win32 permettant d'interdire la mise en veille, qui doit certainement requérir d'être exécutée sous un compte Administrateur d'ailleurs.
    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

  10. #10
    Invité
    Invité(e)
    Par défaut
    Euh oui j'avais oublié ça. C'est pas grave je m'arrangerai pour faire la même sous linux et je rajouterais un bout de code permettant de compiler les bonnes fonctions.
    Mais je me demandais par exemple un lecteur vidéo empêche la mise en veille même quand le processeur n'a qu'un coeur, comment ça se passe pour eux ? Parce que l'on peut toujours interagir avec le lecteur pendant qu'il exécute la fonction empêcher la mise en veille.

  11. #11
    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 pitt77 Voir le message
    Mais je me demandais par exemple un lecteur vidéo empêche la mise en veille même quand le processeur n'a qu'un coeur, comment ça se passe pour eux ? Parce que l'on peut toujours interagir avec le lecteur pendant qu'il exécute la fonction empêcher la mise en veille.
    En général, ils désactivent la fonction de mise en veille / économiseur d'écran en appelant directement l'API native du système d'exploitation.

    Ce qui revient, dans ton cas, à mettre un bout de compilation conditionnelle dans ton application afin d'appeler la "bonne" fonction suivant l'OS de compilation. Sous Windows, cela se fait comme ça. Pour Linux, demande à des linuxiens...
    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

  12. #12
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    J'ai vaguement regardé du côté de la doc de SetThreadExecutionState. Est-ce que la paramètre ES_SYSTEM_REQUIRED ne pourrait pas te permettre de continuer l'execution de ton programme tout en bloquant la mise en veille?

    Sinon, la solution consiste à utiliser une bibliothèque pour créer un thread et lui faire exécuter toute les XX secondes SetThreadExecutionState. Par exemple une de celles citées par Mac LAK.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Oui j'utilise cette fonction dans l'API le truc c'est que ça bloque mon programme quand je l'utilise puisqu'il est bloqué dan la boucle d'appelle.

    Citation Envoyé par caradhras Voir le message
    Sinon, la solution consiste à utiliser une bibliothèque pour créer un thread et lui faire exécuter toute les XX secondes SetThreadExecutionState.
    Oui c'est ça que j'aimerais faire mais le truc c'est que je ne connais rien en thread et j'ai pas trouvé d'exemple pour savoir comment ça se passe

  14. #14
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Voici le lien d'un article concernant l'utilisation des threads avec boost : http://matthieu-brucher.developpez.c.../boost/thread/

    Ca devrait pouvoir te mettre sur la voie. Il y a bien entendu plein d'autres bibliothèques permettant la gestion des threads... L'avantage de celle-là c'est qu'elle est portable et que je l'aime bien, tout simplement

    C'est principalement les parties II et III qui te seront utiles dans ton cas.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Donc si j'ai bien compris mon code ressemblerait à ceci ? :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <boost/thread/thread.hpp>
     
    int main()
    {
     
        if ( option == true)
        {
            boost::thread unThread(&attendre);
        }
     
        suite du code . . .
     
    }
    Donc la fonction attendre serait exécutée et en même temps le programme continuerait de fonctionner ?
    Dernière modification par ram-0000 ; 06/07/2009 à 15h02. Motif: Balise de code

  16. #16
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    En effet! Ca devrait ressembler à ça.

    Ensuite, dans ta fonction "attendre", il te suffit de faire une boucle avec une condition d'arrêt qui exécute SetThreadExecutionState toutes les XX secondes.

    Cependant, comme l'a dit Mac LAK, il y a peut-être une meilleure solution pour bloquer la mise en veille lors de l'execution.

  17. #17
    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 caradhras Voir le message
    Cependant, comme l'a dit Mac LAK, il y a peut-être une meilleure solution pour bloquer la mise en veille lors de l'execution.
    En l'occurrence, c'est certain : la "turbo-bidouille" pour bloquer l'économiseur d'écran, c'est rarement une bonne solution... Il vaut quand même mieux utiliser l'API dédiée.

    Qui, d'ailleurs, n'a pas besoin d'un thread sous Windows...
    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

  18. #18
    Invité
    Invité(e)
    Par défaut
    Oui j'exécute la fonction de l'API ça il n'y a pas de problèmes c'est juste que je ne sais pas comment l'exécuter sans pour autant bloquer le programme dans la boucle d'appel de cette fonction. Je sais que les lecteurs vidéos ou certains logiciels propose des options pour empêcher la mise en veille (pas le screen saver EDIT: En fait si ça aussi c'est juste que je l'ai déjà désactivé) sans utiliser les threads mais ça je ne sais pas comment ils font
    Pour bloquer tout ça il n'y a pas de problème le code le fait déjà manque plus qu'à utiliser la fonction indépendamment du code principale.

  19. #19
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    En l'occurrence, c'est certain : la "turbo-bidouille" pour bloquer l'économiseur d'écran, c'est rarement une bonne solution... Il vaut quand même mieux utiliser l'API dédiée.

    Qui, d'ailleurs, n'a pas besoin d'un thread sous Windows...
    Je crois, par contre, que ce que souhaite bloquer pitt77 c'est l'économiseur d'écran d'une part mais aussi la mise en veille de l'ordinateur (arrêt des disques durs au bout de XX minutes, etc...etc...). Les signaux sont différents pour ces deux événements. Celà dit ça se bloque peut-être de la même manière... j'avoue n'en avoir aucune idée

  20. #20
    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
    Salut,
    C'est typiquement le genre de cas .... pour lesquels je ne ferais pas de thread mais j'utiliserais un timer. Tu rajoutes de la complexité alors que ton besoin est d'appeler une fonction toute les n secondes.

Discussions similaires

  1. Réponses: 20
    Dernier message: 04/04/2014, 11h17
  2. Actualiser un TCD et executer une autre fonction en même temps
    Par lbar012001 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/02/2008, 09h08
  3. lancer deux fonctions en même temps
    Par youp_db dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2006, 12h11
  4. [JFrame]pb de lancement de deux JFrame en même temps
    Par spoutyoyo dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 24/08/2004, 15h33
  5. Lancer deux sons en même temps...
    Par Julien_riquelme dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/05/2003, 17h00

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