C ++ Возможная проблема с многопоточностью - может быть ошибка Ogre - PullRequest
4 голосов
/ 08 октября 2011

У меня очень странная проблема в моем коде. Я использую Ogre и пытаюсь создать материал вручную, но не думаю, что проблема связана с Ogre. Ссылки: Заголовочный файл , Исходный файл , Трассировка стека . Пожалуйста, извините случайные имена, комментарии и std :: cout << 's. Я в отчаянии и получаю удовольствие от кодирования: D </p>

Вот краткое изложение моего кода, если вы не хотите его читать:

  1. Создать root
  2. Загрузка плагинов
  3. Настройка системы рендеринга
  4. Загрузка ресурсов
  5. Настройка системы ввода
  6. Создать менеджер сцены
  7. Создать сцену
    а. Настройка освещения
    б. Вручную создайте материал
    с. Добавить объект в сцену с созданным вручную материалом
  8. Добавление обратного вызова обновления кадра
  9. Начать рендеринг

Теперь, если я пропущу шаги 7b и 7c, код работает нормально и, как и ожидалось, и программа выводит в журнал, как и ожидалось. Но если я включу шаги 7b и 7c, ничего не произойдет, и журнал не будет записан. Код никогда не заканчивает первый шаг. Я считаю, что это тупиковая ситуация с просмотром трассировки стека, но я не знаю, как ее решить - я не понимаю, как добавление кода позже повлияет на код раньше, так как он будет выполняться после исходного кода, поэтому я подозревал, что проблема с потоками. Любые предложения приветствуются! Заранее спасибо, эл.

Редактировать: Удалить большую часть кода, оставив только шаги 1, 7a, 7b и 7c. Я оставляю трассировку стека, потому что она не такая длинная!

Вот код нарушения:

Шаг 1 (строка 13)

mRoot = new Ogre::Root("", "", "ogre.log");

Шаги 7a, b, c (строки 146-169)

mSceneManager->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

std::cout << "Before material creation" << std::endl;


//Make cube material
Ogre::MaterialPtr cube_material_ptr = Ogre::MaterialManager::getSingleton().create(
    "trolcherry",
    Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME
    );
std::cout << "After material creation" << std::endl;

// Get a material pass
Ogre::Pass *pass = cube_material_ptr->getTechnique(0)->getPass(0);
pass->setDiffuse(Ogre::ColourValue(1.0, 0.2, 0.2));


//Make cube
Ogre::Entity& cube_entity = *(mSceneManager->createEntity("Head", "Prefab_Cube"));
cube_entity.setMaterialName("trolcherry");

Ogre::SceneNode& cube_node = *(mSceneManager->getRootSceneNode()->createChildSceneNode());
cube_node.attachObject(&cube_entity);
cube_node.scale(0.3, 0.3, 0.3);

трассировка стека

#0 (    0x0012e416 in __kernel_vsyscall() (??:??)
#1 0x9b20b9 __lll_lock_wait() (../nptl/sysdeps/unix/sysv/linux/i386/i686/../i486/lowlevellock.S:142)
#2 0x9af566 pthread_cond_wait@@GLIBC_2.3.2() (../nptl/sysdeps/unix/sysv/linux/i386/i686/../i486/pthread_cond_wait.S:299)
#3 0x9223fd __pthread_cond_wait(cond=0xb7bd727c, mutex=0xb7bd7264) (forward.c:139)
#4 0x804c65b    boost::recursive_mutex::lock(this=0xb7bd7264) (lib/boost_1_47_0/boost/thread/pthread/recursive_mutex.hpp:133)
#5 0x804d4af    boost::unique_lock<boost::recursive_mutex>::lock(this=0xbffff3c4) (lib/boost_1_47_0/boost/thread/locks.hpp:412)
#6 0x47dd96 unique_lock(this=0xb7bd7260, name=..., inGlobalPool=true) (/usr/include/boost/thread/locks.hpp:227)
#7 (    Ogre::ResourceGroupManager::createResourceGroup(this=0xb7bd7260, name=..., inGlobalPool=true) (/home/elliot/Programming/C and C++/Project MuffinSnatcher/lib/ogre_src_v1-7-3/OgreMain/src/OgreResourceGroupManager.cpp:84)
#8 0x47eaa6 Ogre::ResourceGroupManager::ResourceGroupManager(this=0xb7bd7260) (/home/elliot/Programming/C and C++/Project MuffinSnatcher/lib/ogre_src_v1-7-3/OgreMain/src/OgreResourceGroupManager.cpp:61)
#9 0x497bc2 Ogre::Root::Root(this=0xb7ed7260, pluginFileName=..., configFileName=..., logFileName=...) (/home/elliot/Programming/C and C++/Project MuffinSnatcher/lib/ogre_src_v1-7-3/OgreMain/src/OgreRoot.cpp:154)
#10 0x804adfe   ProjectMuffinSnatcher::Client::Run(this=0xbffff6ec) (/home/elliot/Programming/C and C++/Project MuffinSnatcher/src/Client.cpp:13)
#11 0x804e0da   main() (/home/elliot/Programming/C and C++/Project MuffinSnatcher/src/main.cpp:6)

Вывод ldd

linux-gate.so.1 =>  (0x009a3000)
libboost_system.so.1.42.0 => /usr/lib/libboost_system.so.1.42.0 (0x00c14000)
libOgreMain.so.1.7.3 => /usr/local/lib/libOgreMain.so.1.7.3 (0x00110000)
libOIS-1.3.0.so => /usr/local/lib/libOIS-1.3.0.so (0x006d3000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00ce8000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x006f4000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00f66000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x0071a000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x0087b000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00e7b000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0x008da000)
libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0x00e2d000)
libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0x00894000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0x009a4000)
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0x008ac000)
libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0x00abf000)
libXaw.so.7 => /usr/lib/libXaw.so.7 (0x00b11000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x008bb000)
libboost_thread.so.1.42.0 => /usr/lib/libboost_thread.so.1.42.0 (0x008bf000)
libboost_date_time.so.1.42.0 => /usr/lib/libboost_date_time.so.1.42.0 (0x00960000)
libfreeimage.so.3 => /usr/lib/libfreeimage.so.3 (0x00f82000)
libzzip-0.so.13 => /usr/lib/libzzip-0.so.13 (0x00973000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x0097a000)
/lib/ld-linux.so.2 (0x00c2e000)
libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0x008d4000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0x00b6e000)
libXmu.so.6 => /usr/lib/libXmu.so.6 (0x00b87000)
libXpm.so.4 => /usr/lib/libXpm.so.4 (0x0098f000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0x00b9d000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0x00ba1000)

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Я бы сделал этот комментарий, но мне не хватает нужного представителя. (

Несколько вещей, чтобы попробовать:

Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME - это static OGRE_AUTO_MUTEX String - вместо того, чтобы передавать его непосредственно в create менеджера материалов, попробуйте сначала скопировать его в экземпляр String с локальной областью действия. Посмотрите, изменится ли это место в случае возникновения ошибки или действительно ли оно ее исправит.

В качестве альтернативы я заметил в Ogre::Root constructor, что вы явно переопределяете имена подключаемых модулей и файлов конфигурации по умолчанию с помощью "" (и на самом деле не предоставляете полезную замену файла журнала - изменен с "Ogre.log" на "ogre"). журнал"). Не могли бы вы попытаться удалить аргументы конструктора?

1 голос
/ 17 октября 2011

Я наконец-то исправил свою проблему. Я удалил все связанные с boost & ogre библиотеки и перекомпилировал boost, а затем ogre и переустановил их. Теперь все работает нормально (по-видимому!). Спасибо за всю помощь, но я думаю, что все, что мне нужно, - это новая переустановка. Мало, я рад, что все кончено!

...