2010-11-01 2 views
0

Я программирую 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 не обновляет мое окно

ответ

0

Что вам нужно сделать, это поместить всю вашу обработку в отдельный поток; основной поток GUI должен использоваться только для ответа на события GUI и рисования окна, но не должен выполнять интенсивных вычислений. Итак ... в отдельном потоке, нарисуйте буфер, а затем каждый так часто вам нужно запланировать в главном потоке графического интерфейса, чтобы этот буфер был скопирован в пользовательский интерфейс.

+0

это то, что я делаю. при запуске рендеринга я создаю n новых потоков (n = # из cpu) и raytrace только в этих потоках – Mat

+0

Как вы обновляете нить GUI? –

+0

Я думаю, что нашел проблему. Я создаю свои renderthreads с помощью MFC. в mainthread я жду тех потоков в цикле while (см. выше), чтобы уведомить меня, что они завершили подрайон рендеринга и обновили окно GLUT. Я не знаю, как я могу обновить окно GLUT другим потоком, чем mainthread – Mat