【问题标题】:using wxWidgets in a GLUT/other application在 GLUT/其他应用程序中使用 wxWidgets
【发布时间】:2009-06-13 01:25:13
【问题描述】:

我基本上希望在我的 OpenGL/游戏中加入一个类似于本机的窗口 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(),但结果相同。

【问题讨论】:

  • 为什么主线程需要在wxWidgets框架之外工作?只是好奇,因为我也在使用 wxWidgets/OpenGL 进行游戏,并且只是将空闲功能用于我的“主要”。
  • 我只是不希望我的游戏依赖 wxWidgets... 只依赖于 glut。如果 wxWidgets 可用,很好,我可以显示 GUI。
  • 什么意思? wxWidgets 将在您发布游戏时可用,或者使用静态库版本。

标签: multithreading opengl wxwidgets glut


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你不需要对 wx 做任何特别的事情就可以使用 opengl,只需要画一个wxGLCanvas

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        相关资源
        最近更新 更多