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

Multithreading 在GLUT/其他应用程序中使用wxWidgets,multithreading,opengl,wxwidgets,glut,Multithreading,Opengl,Wxwidgets,Glut,我基本上希望在我的OpenGL/游戏中加入一个类似于本机的WindowGUI系统。我需要向用户显示一个窗口 我正在研究wxWidgets 因为它是通过“窃取”WinMain/MainLoop来工作的,所以我试图破解它,这样我就可以在单独的线程上运行它的主循环 因为我无法让它的wxThread正常工作,所以我用Windows线程做了一个“示例”。。。但wxWidgets内部的初始化仍在中断 对此有何反馈 我的代码是: class MyApp: public wxApp { virtual

我基本上希望在我的OpenGL/游戏中加入一个类似于本机的WindowGUI系统。我需要向用户显示一个窗口

我正在研究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(),但结果相同。

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

要使用opengl,您不必对wx做任何特殊的操作,jsut绘制itno a。

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

为什么需要在主线程的wxWidgets框架之外工作?我只是好奇,因为我也在游戏中使用wxWidgets/OpenGL,只是在我的“main”中使用空闲函数。我只是不想让我的游戏依赖于wxWidgets。。。只有在供过于求的情况下。如果wxWidgets可用,很好,我可以显示GUI。你是什么意思?如果游戏附带wxWidgets,或者使用静态库版本,wxWidgets将可用。