2009-06-13 6 views
0

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

Я ищу 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() в отдельном потоке, но тот же результат.

+0

Зачем вам нужно работать вне рамки wxWidgets для основного потока? Просто любопытно, так как я также использую wxWidgets/OpenGL для игры и просто использую функцию простоя для моего «основного». –

+0

Я просто не хотел, чтобы моя игра зависела от wxWidgets ... только от перенасыщения. Если wxWidgets доступен, хорошо, я могу отобразить графический интерфейс. – fabiopedrosa

+0

Что это значит? wxWidgets будет доступен, если вы отправляете свою игру с ней или используете статическую библиотечную версию. – aib

ответ

0

Вышеприведенный код должен работать, но было бы проще просто позвонить wxEntry() прямо в вашу функцию потока. Возможно, вы также предпочтете использовать его перегруженность WinMain или, по крайней мере, предоставить действительный argc/argv (NULL, поскольку последний может объяснить сбой).

0

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

1

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