Boost线程会覆盖成员变量的值

时间:2014-11-17 09:43:17

标签: boost-thread ogre3d

我目前正在开展一个项目,我们尝试使用Microsoft Kinect开发视频游戏,使用像PAHANTOM这样的触觉反馈设备,以及针对不同3D设备的立体渲染。在当前情况下,一切都在单个线程内运行,并且您可以想象应用程序缺乏性能,因为触觉设备需要以至少1000 Hz运行其控制回路。我在这里要做的是创建4个线程,一个用于使用Ogre3D进行渲染,一个用于碰撞检测,一个用于触觉,最后一个用于管理Kinect收集的数据。

每个部分都有自己的管理器类,如KinectManager,HapticManager等。因为我们使用的是Ogre3D,所以我们有一个名为MainApplication的类,它继承自BaseApplication,其中包含所有必需的函数,如{{1} },setup()等已实施。在configure()内调用函数MainApplication,其中createScene()已创建:

ColisionManager

void MainApplication::createScene() { // Initialize CollisionManager CollisionManager cManager; cManager.run(); // Set the scene's ambient light mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5f, 0.5f, 0.5f)); // Create a Light and set its position Ogre::Light* light = mSceneMgr->createLight("MainLight"); light->setPosition(20.0f, 80.0f, 50.0f); // Haptic indicator Ogre::Entity* hapticJoystick = mSceneMgr->createEntity("hapticPos", "Icosphere.mesh"); hapticNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("hapticPos"); hapticNode->attachObject(hapticJoystick); } 看起来像这样:

CollisionManager.h

#ifndef __COLLISIONMANAGER_H_ #define __COLLISIONMANAGER_H_ #include "HapticManager.h" #include "KinectManager.h" #include <boost/bind.hpp> #include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp> #include <boost/shared_ptr.hpp> #include <OgreManualObject.h> #include <OgreSceneManager.h> bool cManagerReady = false; class CollisionManager { public: CollisionManager(); virtual ~CollisionManager(); void run(); bool isBusy(); private: KinectManager *kManager; HapticManager *hManager; bool mBusy; bool mShutdown; boost::shared_ptr<boost::thread> mThread; boost::mutex mMutex; void work(); }; #endif // __COLLISIONMANAGER_H_ 调用run()中的CollisionManager函数来初始化并启动线程以进行冲突检测。 MainApplication函数将完成所有工作,需要调用非静态成员变量和函数。

实现如下:

work()

目前我使用#include "CollisionManager.h" using namespace std; CollisionManager::CollisionManager() : kManager ( new KinectManager ), hManager ( new HapticManager ), mShutdown ( false ), mBusy ( false ) { } CollisionManager::~CollisionManager(void) { } bool CollisionManager::isBusy() { return this->mBusy; } void CollisionManager::run() { if (!this->mBusy) { this->mBusy = true; this->mThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&CollisionManager::work, this))); } } void CollisionManager::work() { while(!mShutdown) { cout << boolalpha << mShutdown << endl; } } 创建线程,因为我遇到了无法访问非静态成员变量的问题。现在至少我使用boost::shared_ptr解决了这个问题。在shared_ptr函数内,只要work()变量设置为false(即mSutdown中指定的初始值),线程就应该运行。不知怎的,constructor的值被某些东西改变了,无法弄清楚改变值的位置和内容,因为我没有明确地改变它。行为是线程停止运行,因为标志变为mShutdown。使用true中的shared_ptr时会出现这种现象吗?

0 个答案:

没有答案
相关问题