Ускоренный поток переопределяет значение переменных-членов
В настоящее время я работаю над проектом, в котором мы пытаемся разработать видеоигру для слепых и зрячих людей, используя Microsoft Kinect, устройства с тактильной обратной связью, такие как PAHANTOM, и стерео рендеринг для различных 3D-устройств. В текущей ситуации все работает в одном потоке, и, как вы можете себе представить, приложению не хватает производительности, поскольку тактильные устройства должны запускать свой цикл управления с частотой не менее 1000 Гц. Здесь я пытаюсь создать 4 потока: один для рендеринга, выполненного с помощью Ogre3D, один для обнаружения столкновений, один для тактильной, а последний будет управлять данными, собранными Kinect.
Каждая часть имеет свой собственный класс менеджера, такой как KinectManager, HapticManager и т. Д. Поскольку мы используем Ogre3D, у нас есть класс, называемый MainApplication
который наследует от BaseApplication
в котором все необходимые функции, такие как 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()
функция поток должен работать до тех пор, пока mSutdown
переменная имеет значение false, что является начальным значением, назначенным в constructor
, Каким-то образом значение mShutdown
что-то изменяется и не может понять, где и что меняет значение, так как я не изменяю его явно. Поведение таково, что поток перестает работать, потому что флаг поворачивается true
, Это явление имеет тенденцию происходить при использовании shared_ptr
от boost
?