Мой код отлично работает в режиме отладки, но не работает в режиме выпуска.
Вот фрагмент моего кода, где он не работает:
LOADER->AllocBundle(&m_InitialContent);
while(!m_InitialContent.isReady())
{
this->LoadingScreen();
}
AllocBundle () загрузит содержимое, содержащееся в m_InitialContent, и установит для него статус готовности true, когда это будет сделано. Это реализовано с использованием многопоточности.
this->LoadingScreen()
должен отображать экран загрузки, но на данный момент это еще не реализовано, поэтому функция имеет пустое тело.
По-видимому, это может быть причиной ошибки: если я дам функции LoadingScreen () одну строку кода: std::cout<<"Loading"<<std::endl;
, она будет работать нормально.
Если я этого не сделаю, то код застрянет на while(!m_InitialContent.isReady())
. Он даже не перейдет к коду между скобками (this->LoadingScreen();
). И, по-видимому, он также не обновляет выражение в операторе while, потому что оно остается там навсегда.
Есть ли у кого-нибудь идеи, что может быть причиной этого? И если да, то в чем может быть проблема? Я полностью озадачен.
РЕДАКТИРОВАТЬ: Дополнительный код по запросу
член ContentLoader: details::ContentBundleAllocator m_CBA;
void ContentLoader::AllocBundle(ContentBundle* pBundle)
{
ASSERT(!(m_CBA.isRunning()), "ContentBundleAllocator is still busy");
m_CBA.Alloc(pBundle, m_SystemInfo.dwNumberOfProcessors);
}
void details::ContentBundleAllocator::Alloc(ContentBundle* pCB, UINT numThreads)
{
m_bIsRunning = true;
m_pCB = pCB;
pCB->m_bIsReady = false;
m_NumRunningThrds = numThreads;
std::pair<UINT,HANDLE> p;
for (UINT i = 0; i < numThreads; ++i)
{
p.second = (HANDLE)_beginthreadex(NULL,
NULL,
&details::ContentBundleAllocator::AllocBundle,
this,
NULL,&p.first);
SetThreadPriority(p.second,THREAD_PRIORITY_HIGHEST);
m_Threads.Insert(p);
}
}
unsigned int __stdcall details::ContentBundleAllocator::AllocBundle(void* param)
{
//PREPARE
ContentBundleAllocator* pCBA = (ContentBundleAllocator*)param;
//LOAD STUFF [collapsed for visibility+]
//EXIT===========================================================================================================
pCBA->m_NumRunningThrds -= 1;
if (pCBA->m_NumRunningThrds == 0)
{
pCBA->m_bIsRunning = false;
pCBA->m_pCB->m_bIsReady = true;
pCBA->Clear();
#ifdef DEBUG
std::tcout << std::endl;
#endif
std::tcout<<_T("exiting allocation...")<<std::endl;
}
std::tcout<<_T("exiting thread...")<<std::endl;
return 0;
}
bool isReady() const {return m_bIsReady;}