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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 865
    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 865
    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 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

  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 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

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