我基本上希望在我的OpenGL / Game中获得类似本机的窗口GUI系统。我需要向用户显示一个窗口。
我正在研究wxWidgets。
因为它通过“窃取”WinMain / MainLoop工作,我试图破解它,所以我可以在一个单独的线程上运行它的主循环。
因为我无法使其wxThread运行良好,我已经使用Windows线程完成了一个“示例”...但是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(),但结果相同。
答案 0 :(得分:1)
注意:大多数wxWidgets都不是线程安全的!你应该只从一个线程做GUI东西。这应该是运行Windows(或其他)事件循环的线程 - 这是主(启动)线程,或者您调用wxEntry的线程。 我设法从在Windows下运行的单独线程获取OpenGL渲染 - 需要在主线程上创建wxGLCanvas,需要在OpenGL渲染线程中调用SetCurrent,并且必须确保在窗口正在进行时不渲染调整大小等...
答案 1 :(得分:0)
上面的代码应该可以工作,但是直接在你的线程函数中调用wxEntry()
会更简单。您可能也更喜欢使用类似WinMain的重载,或者至少提供有效的argc
/ argv
(后者的NULL
可以解释崩溃)。
答案 2 :(得分:0)
你不需要做任何特殊的事情来使用opengl,只需要绘制成wxGLCanvas。