Я программирую raytracer и использую GLUT для отображения результата. Я визуализирую изображение в субблоках и после рендеринга каждого подблока обновляю представление.Окно GLUT становится черным "(не отвечает)" когда CPU занят
Что происходит, так это то, что я вижу ход визуализации, но через несколько секунд окно визуализации становится черным, а заголовок окна читает «(не отвечает)». однако процесс рендеринга продолжает работать (при 100% -ном использовании процессора) и выводит progressinfo на выход консоли. После завершения рендеринга окно GLUT вернется в нормальное состояние и отобразит изображение.
Что я могу сделать, чтобы окно реагировало во время процесса рендеринга, чтобы оно не стало черным?
Спасибо!
// редактировать: Я Aparently блокировать мой mainthread в ожидании рендер нитей:
while(true){
if(m_activeRenderThreads==0)
break;
::WaitForSingleObject(updateEvent->m_hObject, 200);
notifyObservers(); //inherited from IFunctionObservable
}
notifyObservers() вызывает:
update(){
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,0,resX,resY);
glRasterPos2i(-1,-1);
glDrawPixels(resX, resY, GL_RGB, GL_FLOAT, renderBuffer);
glutSwapBuffers();
}
эта последняя функция работает только тогда, когда я называю его из mainthread. вызов его через renderthreads не обновляет мое окно
это то, что я делаю. при запуске рендеринга я создаю n новых потоков (n = # из cpu) и raytrace только в этих потоках – Mat
Как вы обновляете нить GUI? –
Я думаю, что нашел проблему. Я создаю свои renderthreads с помощью MFC. в mainthread я жду тех потоков в цикле while (см. выше), чтобы уведомить меня, что они завершили подрайон рендеринга и обновили окно GLUT. Я не знаю, как я могу обновить окно GLUT другим потоком, чем mainthread – Mat