[gelöst] Irrlicht, wxWidgets und Thread
-
Hallo,
ich habe gerade die Irrlicht-3D-Engine unter WxWidgets zum laufen gebracht, was ja nicht sonderlich schwer ist:loadIrrlicht::loadIrrlicht(wxFrame* myframe) : wxFrame(myframe, wxID_ANY, _T("IrrlichtFrame"), wxPoint(100,100), wxSize(400,400)) { // ... irr::SIrrlichtCreationParameters param; param.WindowId = reinterpret_cast<void*>(GetHandle()); param.DriverType = irr::video::EDT_OPENGL; irr::IrrlichtDevice* device = irr::createDeviceEx(param); // ... }
Jetzt ist es so, dass man bei Irrlicht eine Endlosschleife braucht wg. Rendering:
while (device->run()) { driver->beginScene(true, true, irr::video::SColor(255,100,101,140)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); }
Wenn ich die direkt in meinen Frame einbaue, dann sehe ich wunderbar alles was in meiner Engine passiert. Allerdings hängt nun mein Programm in der Schleife fest (sprich, der Programmfluss ist unterbrochen). Alle nachfolgenden Aktionen, wie z.B. andere Frames öffnen oder Dialoge benutzen geht nicht.
Also habe ich einen wxThread erstellt, der diese Scheife beinhaltet.
void *IrrlichtThread::Entry() { while ((device->run()) && (gogogo)) { driver->beginScene(true, true, irr::video::SColor(255,100,101,140)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); } return NULL; }
Nur wenn ich über den Thread die Schleife ausführe, dann bekomme ich nur wirre Farbmuster in der 3D-Engine zu sehen.
Also hab ich mir ein Tut über Thread und die Samples von wxWidgets zum Thema Thread angeschaut und irgendwo darin steht jetzt, ich solle keine GUI-Arbeiten von Threads erledigen lassen.
Ich vermute mal, dass das rendern der 3D-Engine schon über die GUI läuft. Folglich bin ich nun Ratlos, was ich tun kann. Ich will ja meinen Programmfluss nicht in einer Endlosschleife haben, weil ich ja noch ein paar andere Fenster zum Arbeiten brauche, kann aber keine Thread benutzen, weil dann das rendern nicht mehr geht. Hat jemand einen Ansatz für mich? Wo kann ich in wxWidgets die Endlosschleife einbauen ohne den Programmfluss in der Schleife zu lassen, ohne Threads?Danke,
Stefan
-
Keine Ahnung was du da anders machen könntest, aber evtl. hilft dir dieser Thread weiter:
http://wxforum.shadonet.com/viewtopic.php?t=17090
-
Ui Danke,
klar hilft das weiter. Man schaue in den Quelltext und sehe folgendes:
- Timerfunktion (Standard 10ms)
- kein wxFrame, sondern ein wxControl
- Deaktivieren der GUI für Paint und Size, weil das die Irrlicht macht.Alles klar.
Und die Klasse funktioniert auch bestens, daher kann ich meine Arbeit einstellen und direkt diese Klasse verwenden und verbessern.
-
Sehr interessant der Link ... danke schonmal.
Wegen dem ersten Post :
while (device->run()) { driver->beginScene(true, true, irr::video::SColor(255,100,101,140)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); }
Da solltest du einen Call zur wxEventLoop einbauen, dann sollte es klappen.