В моем кроссплатформенном проекте большая часть реализована на 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 секунд.
Голову сломал уже, не знаю что с этим делать.



