在GLUT /其他应用程序中使用wxWidgets

时间:2009-06-13 01:25:13

标签: multithreading opengl wxwidgets glut

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你不需要做任何特殊的事情来使用opengl,只需要绘制成wxGLCanvas