문제

기본적으로 OpenGL/게임에 기본적인 Window 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 () 만 호출했지만 동일한 결과.

도움이 되었습니까?

해결책

위의 코드는 작동하지만 전화만으로는 더 간단합니다. wxEntry() 스레드 기능에서 직접. 또한 Winmain과 같은 과부하를 사용하거나 최소한 유효한 것을 제공하는 것을 선호 할 수도 있습니다. argc/argv (NULL 후자는 충돌을 설명 할 수 있습니다).

다른 팁

조심하십시오 : 대부분의 wxwidgets는 스레드 안전하지 않습니다! 단일 스레드에서만 GUI 작업을 수행해야합니다. 이것은 Windows (또는 무엇이든) 이벤트 루프를 실행하는 스레드입니다. 즉, 메인 (시작) 스레드 또는 Wxentry라고 부르는 스레드입니다. Windows 아래에서 작동하는 별도의 스레드에서 OpenGL 렌더링을 얻었습니다. WXGLCANVAS는 기본 스레드에서 생성해야하며 OpenGL 렌더 스레드에서 SetCurrent를 호출해야하며 창이있는 동안 렌더링하지 않아야합니다. 크기 등 ...

OpenGl을 사용하기 위해 WX에 특별한 일을 할 필요는 없습니다. wxglcanvas.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top