Bonjour à tous
Je dois réaliser un mur d'images avec OpenSceneGraph pour un laboratoire de Réalité Virtuelle. Le truc c'est que je dois pouvoir charger un dossier entier d'images sans pour autant altérer la navigation à travers les images déjà afficher. J'ai donc décider de créer un thread en plus du thread principal, qui devra charger les images depuis le disque dur et les soumettre à OpenSceneGraph.
Voici en comment s'organise mon main de test
De mon côté l'application est bien thread-safe (mutex et thread boost).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 #include <OpenMC.hpp> #include <osgGA/TrackballManipulator> class AreaImagesLoader : public openMC::Job { public: /** Constructeur - destructeur. */ AreaImagesLoader(openMC::Area* area, const std::string& path): mArea(area), mPath(path) {} virtual ~AreaImagesLoader(void) {} virtual void run(void) { mArea->loadContent(mPath); } private: openMC::Area* mArea; std::string mPath; }; int main(int argc, char** argv) { try { openMC::SystemController* controller = new openMC::SystemController("RenderingConfig.xml"); openMC::ThreadsPool* pool = controller->getThreadsPool(); openMC::SceneManager* smgr = controller->getSceneManager(); osg::ref_ptr<osgViewer::Viewer> viewer = controller->getViewer(); openMC::Area* images = smgr->createArea("images"); boost::shared_ptr<AreaImagesLoader> loaderImagesSolo(new AreaImagesLoader(images, "../../Data/ImagesSolo")); pool->pushJob(loaderImagesSolo); viewer->realize(); viewer->setCameraManipulator(new osgGA::TrackballManipulator); bool first = true; while (!viewer->done()) { if (first) { boost::shared_ptr<AreaImagesLoader> loaderImagesPerso(new AreaImagesLoader(images, "../../Data/ImagesPerso")); pool->pushJob(loaderImagesPerso); first = false; } smgr->renderAllAreas(); viewer->frame(); } delete controller; } catch (openMC::Exception e) { MessageBox(0, e.getFullDescription().c_str(), "An error has occured", MB_OK | MB_ICONERROR); return 1; } return 0; }
Le problème c'est que ça plante du côté d'OSG (sur un std::vector) et je n'ai pas le moyen de voir ou ça plante ni pourquoi (>osg55-osgd.dll!576c2809())
Comment puis-je rendre OSG thread-safe ?
Kromagg
Partager