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 :
Donc je peux transformer des codes 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 }
en
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); }
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.
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); }
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 :
Mais cela ne marchera pas, et puis cela promet de perdre tout futur codeur qui bossera sur le projet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part # define { Tools::ThreadChecker::get()->checkThatYouAreInTheMainThread();
Merci par avance à ceux qui pourront m'aider.
Partager