GLUT /他のアプリケーションでのwxWidgetsを使用して
-
13-09-2019 - |
質問
私はbasicly私のOpenGL /ゲームにネイティブのようなウィンドウのGUIシステムを取得するために探しています。私は、ユーザーへの単一のウィンドウを表示する必要があります。
私はwxWidgetsのに探しています。
それはWinMain関数/メインループを「盗む」ことによって動作しますので、、私は別のスレッド上でのメインループを実行することができますので、それをハックしようとしています。
私はその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を呼び出す1、です。 wxGLCanvasは、メインスレッド上で作成する必要があり、スレッドをレンダリングOpenGLでSetCurrentを呼び出す必要があり、あなたは、ウィンドウがされている間、あなたがレンダリングされないことを確認しなければならない - 私は、OpenGLは、Windowsの下で働いて別のスレッドからのレンダリングを得ることができましたリサイズ、等...
あなたは wxGLCanvas 。