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
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
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.
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.
> 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.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.