Вопрос

По сути, я хочу добавить в свою OpenGL/Game систему графического пользовательского интерфейса, подобную встроенной в окно.Мне нужно отобразить пользователю одно окно.

Я изучаю wxWidgets.

Поскольку он работает путем «кражи» WinMain/MainLoop, я пытаюсь взломать его, чтобы запустить его основной цикл в отдельном потоке.

Поскольку мне не удалось заставить его wxThread работать нормально, я сделал «пример» с Windows Threads...но инициализация все еще прерывается во внутренних компонентах 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 последнее могло бы объяснить аварию).

Другие советы

Остерегаться:большая часть wxWidgets не является потокобезопасной!Вы должны выполнять действия с графическим интерфейсом только из одного потока.Это должен быть поток, в котором выполняется цикл событий Windows (или чего-то еще) - это основной (запускаемый) поток или тот, в котором вы вызываете wxEntry.Мне удалось добиться рендеринга OpenGL из отдельного потока, работающего под Windows: wxGLCanvas необходимо создать в основном потоке, необходимо вызвать SetCurrent в потоке рендеринга OpenGL, и вы должны убедиться, что вы не выполняете рендеринг во время создания окна. изменен размер и т. д.

Вам не нужно делать ничего особенного для wx, чтобы использовать opengl, просто нарисуйте его. wxGLCanvas.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top