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

C++ Discussion :

Injection de multithread dans du code qui a 15 ans.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut Injection de multithread dans du code qui a 15 ans.
    Bonjours à nouveau,

    Il m'a été confié la délicate mission de délocaliser dans des threads secondaires des parties d'un programme qui a déjà bien vécu.

    Après avoir levé les bras bien haut et précisé que ce genre d'opération était risqué et que la délocalisation ne serait sans aucun doute que très partielle, j'ai mis ne place un ThreadManager qui sait lancer dans un nouveau thread une méthode avec des paramètres donnés, puis lorsque celui-ci est terminé, générer un évènement qui déclenchera une autre méthode dans mon thread principal.

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class ThreadManager_core
    {
    public :
            template<       typename Class1, typename MethodForThread, typename ParamIn,
                            typename Class2, typename MethodAfterThread, typename ParamsOut
                    >
            void createThread(Class1*, MethodForThread, ParamIn*,Class2*, MethodAfterThread, ParamsOut*,HWND, ProgressHandler* pHandler=NULL);          // lance un thread
    }
    Donc je peux transformer des codes comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void loadDatas(const std::string& sFileName)
    {
       Datas newDatas = loadDatasInFile(sFileName);
       createViewOfDatas(newDatas);
    }
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void loadDatas(const std::string& sFileName)
    {
       Datas newDatas;
       ThreadManager::get()->createThread(this,loadDatasInSecondaryThread,&sFileName,this,integrateDatas,&newDatas);
    }
    void loadDatasInSecondaryThread(const std::string& sFileName)
    {
       Datas newDatas = loadDatasInFile(sFileName);
    }
    void integrateDatas(Datas newDatas)
    {
       createViewOfDatas(newDatas);
    }
    La gestion des paramètres de mes deux méthodes est un peu plus complexe que cela, mais ce n'est pas ce qui nous intéresse ici.



    Ceci marche bien tant que la méthode que l'on exécute dans le thread n'accède pas aux mêmes variables que celles de mon thread secondaire. Or je ne connais pas la moitié du code de l'application que je modifie.

    J'ai réalisé un ThreadChecker qui vérifie que l'on est dans le thread principal. Et, si je suis cohérent, il me faut l'appeler partout dans mon programme, afin qu'il asserte si mes threads secondaires appelent des méthodes qui accèdent aux données de mon thread principal.

    Ce qui veut dire : modifier toutes les méthodes de tous les fichiers de mon programme.

    Avant de lançer ma moulinette qui va faire ça, je me demandais si quelqu'un envisageait une méthode plus class.
    J'ai pensé un moment définir une macro "{", quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # define { Tools::ThreadChecker::get()->checkThatYouAreInTheMainThread();
    Mais cela ne marchera pas, et puis cela promet de perdre tout futur codeur qui bossera sur le projet.

    Merci par avance à ceux qui pourront m'aider.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    je te conseille boost::thread ... ne refais pas ce genre de chose...

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    ... utilise aussi openmp

    il permet justement de profiter du multi-core pour des programmes existants, puisqu'il agit a un niveau assez fin, les boucles

    openmp + boost::thread = pas mal d'ennuis en moins

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    aussi cela ne sert a rien de deporter en multi thread des bouts de codes que de toute facon on attend dessus ....

    as-tu des algos compliqués qui prennent du temps ?
    Que veux-tu vraiment ameliorer en utilisant des threads secondaires ?

  5. #5
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par epsilon68
    aussi cela ne sert a rien de deporter en multi thread des bouts de codes que de toute facon on attend dessus ....
    as-tu des algos compliqués qui prennent du temps ?
    Que veux-tu vraiment ameliorer en utilisant des threads secondaires ?
    Cela sert à pouvoir en lançer plusieurs à la fois, et à continuer d'utiliser l'IHM pendant ce temps.

    Le logiciel en question manipule des données assez lourdes et que le chargement et certains calculs prennent parfois plusieurs minutes.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    c'est quoi comme IHM (Qt ? ... ? )

  7. #7
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Merci de ces si rapides réponses.

    J'aurais du préciser dans le message d'origine que je n'ai pas le droit, pour des raisons de politiques de gestion de projet qui ne sont pas de mon ressort, d'utiliser boost, ni d'ailleurs la moindre librairie ou le moindre bout de code qui ne soit déjà partie intégrante de mon projet.

    Merci tout de même

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

Discussions similaires

  1. [AC-2007] Erreur de compilation dans un code qui pourtant fonctionne
    Par cslbcg dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/11/2009, 23h11
  2. un probléme dans un code qui m'a géné
    Par jack_1981 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/01/2008, 17h53
  3. [DOM] java.lang.ClassCastException dans un code qui modifie un fichier XML
    Par RouRa22 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 21/12/2007, 16h21
  4. Réponses: 8
    Dernier message: 26/11/2007, 17h02
  5. Réponses: 9
    Dernier message: 06/08/2007, 01h37

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