использование wxWidgets в GLUT/другом приложении
-
13-09-2019 - |
Вопрос
По сути, я хочу добавить в свою OpenGL/Game систему графического пользовательского интерфейса, подобную встроенной в окно.Мне нужно отобразить пользователю одно окно.
Я изучаю wxWidgets.
Поскольку он работает путем «кражи» WinMain/MainLoop, я пытаюсь взломать его, чтобы запустить его основной цикл в отдельном потоке.
Поскольку мне не удалось заставить его wxThread работать нормально, я сделал «пример» с Windows Threads...но инициализация все еще прерывается во внутренних компонентах wxWidgets...
Есть отзывы по этому поводу?
Мой код таков:
class MyApp: public wxApp
{
virtual bool OnInit();
};
DECLARE_APP(MyApp)
IMPLEMENT_APP_NO_MAIN(MyApp)
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
wxApp* pApp = new MyApp();
wxApp::SetInstance(pApp);
int argc = 0; wxChar ** argv = NULL;
wxEntryStart(argc, argv);
pApp->CallOnInit();
pApp->OnRun();
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wxCmdLineArgType lpCmdLine, int nCmdShow) {
DWORD id = 0;
CreateThread(NULL,0, MyThreadFunction,NULL, 0,&id);
assert(id != NULL);
return 0;
}
Я пробовал создать код инициализации wxWidgets в основном потоке и вызывать CallOnInit() только в отдельном потоке, но результат тот же.
Решение
Приведенный выше код должен работать, но было бы проще просто вызвать wxEntry()
непосредственно в вашей функции потока.Вы также можете предпочесть использовать его перегрузку, подобную WinMain, или, по крайней мере, предоставить действительные argc
/argv
(NULL
последнее могло бы объяснить аварию).
Другие советы
Остерегаться:большая часть wxWidgets не является потокобезопасной!Вы должны выполнять действия с графическим интерфейсом только из одного потока.Это должен быть поток, в котором выполняется цикл событий Windows (или чего-то еще) - это основной (запускаемый) поток или тот, в котором вы вызываете wxEntry.Мне удалось добиться рендеринга OpenGL из отдельного потока, работающего под Windows: wxGLCanvas необходимо создать в основном потоке, необходимо вызвать SetCurrent в потоке рендеринга OpenGL, и вы должны убедиться, что вы не выполняете рендеринг во время создания окна. изменен размер и т. д.
Вам не нужно делать ничего особенного для wx, чтобы использовать opengl, просто нарисуйте его. wxGLCanvas.