2009-06-13 17 views
0

Je cherche fondamentalement à obtenir un système d'interface graphique de type natif dans mon OpenGL/jeu. J'ai besoin d'afficher une seule fenêtre à l'utilisateur.en utilisant wxWidgets dans une application GLUT/autre

Je regarde wxWidgets. Parce qu'il fonctionne en "volant" le WinMain/MainLoop, j'essaye de le pirater pour que je puisse exécuter sa boucle principale sur un thread séparé.

Parce que je ne pouvais pas obtenir son wxThread fonctionne bien, je l'ai fait un « échantillon » with Windows threads ... mais l'initialisation se brise encore sur les entrailles wxWidgets ...

Tous les commentaires sur ce ?

Mon code est le suivant:

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; 
} 

J'ai essayé de faire le code d'initialisation wxWidgets dans le thread principal, et seulement appeler la CallOnInit() dans le thread séparé, mais même résultat.

+0

Pourquoi avez-vous besoin de travailler en dehors du framework wxWidgets pour le thread principal? Juste curieux puisque j'utilise aussi wxWidgets/OpenGL pour un jeu et utilise simplement la fonction inactive pour mon "main". –

+0

Je ne voulais pas que mon jeu dépende de wxWidgets ... seulement sur la surabondance. Si wxWidgets est disponible, très bien, je peux afficher l'interface graphique. – fabiopedrosa

+0

Que voulez-vous dire? wxWidgets sera disponible si vous expédiez votre jeu avec celui-ci, ou utilisez la version statique de la bibliothèque. – aib

Répondre

0

Le code ci-dessus devrait fonctionner, mais il serait plus simple de simplement appeler wxEntry() directement dans votre fonction de fil. Vous pourriez également préférer utiliser sa surcharge WinMain-like ou au moins fournir argc/argv valide (NULL pour que ce dernier puisse expliquer le crash).

0

Vous n'avez rien de spécial à faire pour utiliser opengl, jsut dessine un wxGLCanvas.

1

Attention: la plupart des wxWidgets ne sont pas sécurisés pour les threads! Vous devriez seulement faire des choses d'interface graphique à partir d'un seul thread. Cela devrait être le thread qui exécute la boucle d'événement Windows (ou autre) - c'est le thread principal (démarrage), ou celui, où vous appelez wxEntry. J'ai réussi à obtenir le rendu OpenGL à partir d'un thread séparé fonctionnant sous Windows - le wxGLCanvas doit être créé sur le thread principal, besoin d'appeler SetCurrent dans le thread de rendu OpenGL, et vous devez vous assurer que le rendu n'est pas en cours de redimensionnement, etc ...