Ускоренный поток переопределяет значение переменных-членов

В настоящее время я работаю над проектом, в котором мы пытаемся разработать видеоигру для слепых и зрячих людей, используя 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?

0 ответов

Другие вопросы по тегам