[linux-l] Open GL ohne Event Handling?

Oliver Bandel oliver at first.in-berlin.de
Di Okt 7 22:59:30 CEST 2003


On Tue, Oct 07, 2003 at 08:21:04PM +0200, Olaf Radicke wrote:
> Am Die, 2003-10-07 um 12.06 schrieb Christoph Lange:
> > Kann mir jemand eine Bibliothek nennen, mit der ich OpneGL in ein
> > Fenster ausgeben kann, ohne daß dies in einer Event Handling Loop
> > geschieht?
> 
> Hhhmmm, ich kenne EHL (Event Handling Loop) nur von Perl/Tk, 
> Python/Tkinter, GTK+ und Qt. (Wo bei es bei Qt auch ein OpenGL-
> Widget gibt). Ohne ein EHL könnte man weder das Programm beenden
> noch das Fenster neu zeichnen lassen wenn man es hin und her
> schiebt. (Weil das Programm nicht weiß, das sein Fenster verschoben
> wurde). Als bin ich mir nicht sicher ob es wirklich das ist was
> du willst.
>  
> > Hintergrund: Ich will INNERHALB eines Programmflusses einige wenige
> > Zeichenanweisungen für OpenGL absetzen, so etwa:
> > 
> > öffne OpenGL-Window
> > ...
> > tue dies und jenes interessante,
> > male jetzt ein grünes Rechteck in die rechte obere Ecke,
> > tue jetzt wieder was anderes etc.
> > ...
> > schließe OpenGL-Window.
> > 
> > Das Problem mit, z.B., glut ist, 
> 
> Sorry - was ist "glut"
> 
> > daß man eine OpenGL Event Loop
> > startet, in der man lediglich innerhalb von Callbacks die Möglichkeit
> > hat, etwas tun zu lassen. 
> 
> Also z.B. User drückt Button "Film abspielen". Der Klick auf dann
> Button ist das Event welches das Signal "geklickt" an das Objekt
> Button schickt. Das Objekt Button ist mit dem Callback der Funktion
> oder der Methode eines Objektes verbunden. Diese Methode oder
> Funktion fängt an Figuren zu zeichnen in das betreffende Widget.
> EHL wird erst wieder gestartet wenn die Funktion oder die Methode
> abgearbeitet ist. Wenn in der zeit das Fenster verschoben wird
> bleibt alles grau und wird erst wieder neu gezeichnet wenn die
> EHL wieder gestartet wurde. Will man das auch zwischen durch das
> Fenster aktualisiert wird und das auch der Button "beenden" 
> gedrückt werden kann, muss man zwischen durch die EHL ab und
> an durch laufen lassen oder bei rechen intensiven Funktionen
> ein Thread machen.
> 
> > Dieses Callback aber, das für das Zeichnen
> > der momentanen Darstellung der Szene verantwortlich ist, wird immer
> > wieder neu aufgerufen, nämlich dann, wenn etwas neu zu zeichnen ist.
> 
> Du wirst auch bei OpenGL den Callback verändern können bzw.
> das Signal-Handling. Bei Qt heißt das z.B. QObjekt::disconnect()
> So kann man dann wild im Code alles mit allem "connecten" und
> "disconnecten" bis man selber nicht mehr weiß wer was wann warum
> tut...
> 
> > UND, das ist mein Problem, wenn ich darin etwas anderes, einen
> > kontinuierlichen Programmfluß, haben will, muß ich mein Programm
> > fragmentieren und Zustände und Sprungmarken definieren, damit ich bei
> > jedem Aufruf des Callbacks genau das getan bekomme, was ich haben
> > will.
> 
> Man könnte auch den User mit einem putzigen Vortschritbalken während
> der Bearbeitung unterhalten und alle oder einige Buttons sperren
> in der Zeit. 
> 
> > Meine momentane Lösung ist das Kidnapping der Event Loop, indem ich
> > innerhalb des Display-Callbacks einfach eine Endlosschleife mache.
> 
> Ich glaube ich muss das sehen mit ich verstehen kann was
> du willst. Bist du morgen in der Lehrterstr.?


Falls ihr beiden morgen da seit... schön,
ich wollte morgen ausnahmsweise auch mal kommen.

Meine 3D-App. (leider nur das Grundgerüst, aber das läuft schon;
der eigentliche "Content" kommt, wenn ich mehr Ruhe/Muße dafür
habe) bringe ich dann mal mit. :-)  Habe das Teil zwar schon
seit einem 3/4 Jahr nicht mehr angefasst, aber so ungefähr
erinnere ich mich noch daran, daß das mit drei Threads wunderbar
lief: Ein Server, ein Parser (erst mal nur die leere Hülle;-)),
eine Echtzeit 3D-Animation (erst mal was aus'm Redbook rein gestopft,
als Lückenfüller, bis mein eigenes Zeugs gereift ist ;-))


Ist jedenfalls mit Threads ganz einfach.
Aber einzelne Prozesse sollten auch gut gehen, muß
man halt bloß die Kommunikation etwas umstricken.

So, jetzt muß ich die Kiste mal ausmachen, um in die
Kiste zu gehen, damit ich morgen wieder fit bin
( u.a. mal wieder 'n Job suchen...  btw: falls da
 jemand einen weiß, please bescheid-geb! ).


Ciao,
   Oliver




Mehr Informationen über die Mailingliste linux-l