0

我基本上希望在我的 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(),但结果相同。

4

3 回答 3

1

注意:大多数 wxWidgets 都不是线程安全的!你应该只从一个线程做 GUI 的东西。这应该是运行 Windows(或其他)事件循环的线程 - 这是主(启动)线程,或者是您调用 wxEntry 的线程。我设法从在 Windows 下工作的单独线程获得 OpenGL 渲染 - wxGLCanvas 需要在主线程上创建,需要在 OpenGL 渲染线程中调用 SetCurrent,并且您必须确保在窗口正在渲染时不渲染调整大小等...

于 2010-04-30T10:37:39.527 回答
0

上面的代码应该可以工作,但是wxEntry()直接在你的线程函数中调用会更简单。您可能还更喜欢使用其类似 WinMain 的重载,或者至少提供有效的argc/ argvNULL因为后者可能会解释崩溃)。

于 2009-06-13T19:00:49.830 回答
0

你不需要对 wx 做任何特别的事情来使用 opengl,只需要在wxGLCanvas上绘制它。

于 2010-01-06T20:06:03.907 回答