В моем кроссплатформенном проекте большая часть реализована на OpenGL (основное окно визуализации информации). Для создания окон и контекстов OpenGL используется библиотека GLFW.
А вот диалоговые окна (настройка параметров приложения) хочу пока оставить на LCL.
У библиотеки GLFW, которая создает окно для OpenGL есть своя обработка сообщений с вызовом callback-функций:
- Код: Выделить всё
while not Terminated do
begin
...
glfwPollEvents;
end;
И для работы окон с LCL тоже нужна своя обработка сообщений:
- Код: Выделить всё
while not Terminated do
begin
...
Application.ProcessMessages;
end;
В моем случае надо их как-то скрестить. Я сделал так:
- Код: Выделить всё
Application.Initialize;
StartUpPanel := TStartUpPanel.Create(nil);
StartUpPanel.Show;
OpenSaveDlgForm := TOpenSaveDlgForm.Create(nil);
OpenSaveDlgForm.Show;
Application.ProcessMessages;
OpenSaveDlgForm.Hide;
Application.ProcessMessages;
...
StartUpPanel.Hide;
while not Terminated do
begin
...
glfwPollEvents;
Application.ProcessMessages;
end;
...
StartUpPanel.Free;
OpenSaveDlgForm.Free;
Но есть проблемы, которые проявляются только под Linux:
1. Примерно в половине случаев (может меньше, но не суть) на старте программа подвисает. Появляется первое окно с LCL (просто черный прямоугольник) и все. В остальных случаях все работает как надо.
2. Если перед использованием окна с LCL не выполнить последовательность
- Код: Выделить всё
OpenSaveDlgForm.Show;
Application.ProcessMessages;
OpenSaveDlgForm.Hide;
то при вызове диалога (OpenSaveDlgForm.Show) этот диалог подвиснет. Указанная последовательность вроде спасает, но как-то не красиво. Такое ощущение, что окно и его контролы создаются не в момент OpenSaveDlgForm := TOpenSaveDlgForm.Create(nil), а когда вызывается OpenSaveDlgForm.Show.
3. При закрытии программы процессор грузится целиком и так продолжается от 5 до 30 секунд.
Голову сломал уже, не знаю что с этим делать.