2014-03-10 4 views
2

У меня есть программа с OpenGL, работающая во вторичном потоке. Если цикл визуализации выполнен, я вызываю glfwDestroyWindow(). Тем не менее, окно не закрывается, прежде чем выйти из основного блока. Если я попытаюсь закрыть его несколько раз (неоднократно нажимая на x), появляется всплывающее окно, в котором говорится, что окно не отвечает и просит меня выйти из игры.glfwDestroyWindow не закрывает окно

Почему glfwDestroyWindow не правильно закрывает мое окно?

EDIT: Кстати, я использую GLFW3.

EDIT2:

Это как мой код выглядит следующим образом, в основном. Я вижу выход, пока окно все еще открыто. Окно закрывается только тогда, когда я либо закрываю его, либо выхожу из основного потока.

Главная нить:

int main() { 
    startOpenGLThread(); 
    while(1); 
} 

OpenGL нить:

Window::start() { 
    initGLFW(); 
    while(!glfwWindowShouldClose()); 
    glfwDestroyWindow(); 
    cout << "I can see this ouput, but the window is still open!" << endl; 
} 

EDIT3:

Окно закрывается, если я поставил glfwTerminate() сразу за выходом, очевидно. Однако этого я не хочу, потому что у меня могут открыться другие окна.

ответ

1

Возможно, вы вызываете glfwDestroyWindow() из основного цикла. Основное применение GLFW должен выглядеть как этот

GLFWwindow * win = glfwCreateWindow(...) 

while (!glfwWindowShouldClose(win)) { 
    ... process input ... 
    glfwMakeContextCurrnet(win); 
    ... do rendering stuff ... 
    glfwSwapBuffers(win); 
} 
glfwDestroyWindow(win); 

Для того, чтобы закрыть приложение, по-видимому, есть некоторые немного ввода, что вы будете интерпретировать как команду останова. Если человек нажимает «ESC», вы можете выбрать его в обработчике обратного вызова ключа GLFW. Но когда вы получите этот сигнал, вы НЕ должны называть glfwDestroyWindow(). Вместо этого вы должны позвонить glfwSetWindowShouldClose(win, 1), чтобы сообщить GLFW, что он может выйти из основного цикла и безопасно уничтожить окно в основном потоке.

+0

Я уже делаю это, как вы сказали. Однако glfwCreateWindow, цикл и glfwDestroyWindow находятся во вторичном потоке. – gartenriese

+0

Быстрый вопрос: почему вы вызываете glfwMakeContextCurrent внутри цикла? Разве это не достаточно до петли? – gartenriese

+0

Если вы работаете только с одним окном в своем приложении, да, достаточно вызвать 'glfwMakeContextCurrent' один раз после создания окна. – Jherico

2

Для завершения операции закрытия необходимо позвонить glfwPollEvents() или glfwWaitEvents(). Вставьте один glfwWaitEvents(); в свою петлю, и окно должно закрыть.

Смежные вопросы