использование wxWidgets в GLUT / другом приложении - PullRequest
0 голосов
/ 13 июня 2009

Я просто ищу встроенную в Windows OpenGL / Game систему, похожую на окна. Мне нужно отобразить одно окно для пользователя.

Я смотрю в 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 ]

1 голос
/ 30 апреля 2010

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

0 голосов
/ 06 января 2010

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

0 голосов
/ 13 июня 2009

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

...