Forum: PC-Programmierung GTK+, wie eigenen Code ausführen


von Thorsten Stoffregen (Gast)


Lesenswert?

Hi,

ich bastel grad an einen Frontend für meinen Roboter. Hab mich
also heute ein bischen in die gtk+ programmierung eingelesen.
Klappt auch ganz gut, also schnell mal ne einfache Oberfläche
zusammengebastelt.
Jetzt wollte ich mir die Zeichen, die ich über rs232 an den
PC sende anzeigen lassen.
Aber wo bringe ich den Code dafür unter? Die Hauptschleife von gtk,
die gtk_main() wird ja erst verlassen wenn das Programm beendet
wird.


mfg
Thorsten Stoffregen

von Christoph _. (chris)


Lesenswert?

Du könntest zum Beispiel einen zweiten Thread benutzen. Der erste Thread
könnte dann ruhig in der Hauptschleife von GTK+ blockieren, der zweite
sorgt einfach für den Empfang der Daten. Über Events o.ä. sollten die
Threads kommunizieren können, etwa wenn neue Daten anliegen.
Ich weiß grad nicht, ob Gtk+ (bzw. wohl eher Gdk) schon so etwas
anbietet, aber du könntest z.B. boost.threads benutzen (um
plattformunabhängig zu bleiben):
http://www.boost.org/doc/html/threads.html

Falls du C programmieren solltest, dafür gibt es bestimmt auch
plattformunabhängige Thread-Libs.
Falls du C++ programmierst, wirst du boost früher oder später eh
benutzen (Teile aus boost fließen ja sogar in den nächsten C++-Standard
ein, soweit ich weiß). Allein schon wegen so grundlegender Dinge wie
smart pointer oder boost::bind lohnt es sich zu installieren. Benutz
einmal boost::bind, boost::lambda und/oder boost::function und du wirst
es nie wieder missen wollen. :-)
http://www.boost.org/libs/libraries.htm

Nur aus Interesse, welche Lib benutzt du zum Zugriff auf die
rs232-Schnittstelle? Läuft die unter den gängigen Betriebssystemen
*nix/Win/OSX?

btw: Nicht ganz zum Topic, aber falls du C++ programmierst, kann ich
dir empfehlen, dir mal gtkmm anzuschauen ( http://www.gtkmm.org/ ). Das
ist ein dünner Wrapper über Gtk+, wodurch die C-Funktionen ein IMHO sehr
schönes C++-Interface bekommen (im Vergleich zu vielen anderen
C++-GUI-Libs). Laufzeitoverhead ist praktisch nicht vorhanden, leider
ist das Einrichten unter Windows nicht ganz so intuitiv (nur für den
Programmierer, der Anwender bekommt nur ein paar DLLs zum schon
vorhandenen GTK+ dazu).
Ein Beispiel, wie man mit gtkmm (plattformunabhängig) Threads benutzt,
gibt es z.B. hier:
http://www.c-plusplus.de/forum/viewtopic.php?t=113528

von Thorsten Stoffregen (Gast)


Lesenswert?

Hi Christoph,

vielen Dank für die ausführliche Antwort, ich programmiere in c unter
Linux.
Hab jetzt eine timeout funktion gefunden:
http://gtk.org/tutorial/ch-timeouts.html
Das sollte erstmal reichen, mit Threads kenn ich mich garnicht aus,
bislang hab ich nur Programme für avrs geschrieben. Deshalb machs ich
mir erstmal so einfach wie möglich.

Für rs232 nutze ich im Moment noch gar keine Lib. Ich öffne einfach
/dev/ttyN und lese daraus.

von Martin #. (martin-)


Lesenswert?

Hallo.
Ich Programiere GUI unter Linux auch mit gtk.
Momentan benutze ich auch timeout funktion:
1
gtk_timeout_add(125,(GtkFunction)mainctl,(gpointer)&apd );
Es gibt aber im zusammenhang mit dieser Funktion und seriellen
Schnittstelle ein kleines Problem: man soll eigentlich immer mit
select(..) warten bis man Zeichen empfangen kann, das blokiert aber
auch die kompllete GUI. Man kann zwar select(..) weglassen aber dann
ergeben sich Fehler bei der übertragung.

Deshalb wäre es viel besser die übertragungfunktionen in einem
separaten Thread oder sogar Prozess auszuführen, und nur über pipe oder
sharedmemory mit GUI zu komunizieren.

Für Threads gibt es POSIX Threads library:
http://dis.cs.umass.edu/~wagner/threads_html/tutorial.html
mit der man sehr einfach ein Multithreading-Programm realisieren kann.


>Nur aus Interesse, welche Lib benutzt du zum Zugriff auf die
rs232-Schnittstelle?
@Christoph
Unter Linux macht eine extra Lib keinen Sinn weil der Zugriff auf
Hardware von hausaus sehr simpel und sauber gelöst wurde.

von Rolf Magnus (Gast)


Lesenswert?

> Deshalb wäre es viel besser die übertragungfunktionen in einem
> separaten Thread oder sogar Prozess auszuführen, und nur über pipe
> oder sharedmemory mit GUI zu komunizieren.

Inwiefern ist das besser? Die pipe muß ich genauso lesen wie die
Schnittstelle, und ich hab daher auch die gleichen Probleme damit.

> Unter Linux macht eine extra Lib keinen Sinn weil der Zugriff auf
> Hardware von hausaus sehr simpel und sauber gelöst wurde.

Ja, aber auch systemspezifisch, daher kann eine Lib, die die
Abhängigkeiten kapselt, durchaus sinnvoll sein.

Threads hab ich übrigens noch nie gebraucht. Bei Qt gibt's was, damit
ein Filedeskriptor bei eintreffenden Daten ein Signal (Qt-Signal, nicht
Un*x-Signal) sendet. Das trägt den Deskriptor eben in das select der
internen Eventloop mit ein. Sowas muß es doch auch bei Gtk geben.

von Martin #. (martin-)


Lesenswert?

>Inwiefern ist das besser?
In sofern das es im eigenen Thread läüft.
>Die pipe muß ich genauso lesen wie die
Dies geschiet aber wirklich um einiges schneller als von der seriellen
Schnittstelle, deshalb läuft man nicht die Gefahr dass die  GUI hängt.


>Bei Qt gibt's was, damit ein Filedeskriptor
Ja, aber warum etwas mit Funktionen eines GUI-Toolkits lösen, was
nichts mit GUI zutun hat.
Ausserdem entsteht dadurch einen starke Bindung an einen GUI-Toolkit.

>Ja, aber auch systemspezifisch
Stimmt, habe nichts einzuwenden.

von Fritz G. (fritzg)


Lesenswert?

Mach doch einfach ein select() rein. Beim select kannst du ein Timeout
setzen (z.B. 10ms) wenn der erreicht wurde überspring den Rest, sonst
liest du ein Zeichen von der Schnittstelle.
Eleganter ist es mit einem Thread, so mach ich es, man muss sich halt
etwas mit Threads auseinandersetzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.