GTK Problem??
-
Ohne den Code gelesen zu haben, vermute ich, dass dein Problem auf den Threads basiert. Du musst in deiner Anwendung die GLib Threads aktivieren (g_thread_init). Dann ist die einfachste Möglichkeit, die du hast, die Funktion, die die Zahlen eintragen soll, im Hauptthread mit g_idle_add aufzurufen.
-
Ohne den Code gelesen zu haben, vermute ich, dass dein Problem auf den Threads basiert. Du musst in deiner Anwendung die GLib Threads aktivieren (g_thread_init). Dann ist die einfachste Möglichkeit, die du hast, die Funktion, die die Zahlen eintragen soll, im Hauptthread mit g_idle_add aufzurufen.
-
Ich sehe da nichts was direkt falsch ist und warum das jetzt einfrieren soll kann ich nicht sagen, momentan sehe ich einfach nichts was das eindeutig verursachen könnte (ausführen kann ich das programm auch nicht).
Ich sehe da nur ein paar Sachen die ich nicht so gemacht hätte:
1. Ich würde anstatt colne() würde ich hier gtk_timeout_add() verwenden.2. Anstatt dieser ganzen globalen Variablen würde ich sie zu einem Datentyp zusammenfassen (z.B struct appdata{ ...}) dann mit g_object_set_data an das Hauptfenster binden und wo es gebraucht wird mit g_object_get_data sich den pointer holen.
3. Das ganze RS232 Teil hast wohl aus dem Buch "C und Linux" übernomen ohne es sonderlich gut zu verstehen was da vorsich geht (oder war das doch Absicht ?), aber hier ist es doch unnötig standart ein/ausgabe auf serielle Schnittstele um zuleiten.
Du willst ja nur Daten empfangen, also man braucht die serielle Schnittstelle nur zu öffen, konfigurieren, Daten empfangen und schliessen.
Ich habe mir extra Funktionen für solchen Zweck geschrieben (send_byte,reciv_byte u.ä.), ich kann sie später posten.Alles im allen würde ich also einige Änderungen am desing des Programm vornehmen.
Wenn du Fragen hast , dann poste sie.
Sollte ich doch etwas in deinem Code entdecken das poste ich es.
-
Hallo!
Erstmal vielen Dank für die spontane Hilfe!
Ich habe jetzt als erstes mal damit bekonnen, clone zu ersetzen, da auch ich schon vermutet habe, dass es an den threads liegt.
Ich habe also
clone(&terminal_test,stack+STSZ-1,CLONE_VM | SIGCHLD | CLONE_FILES | CLONE_FS,NULL);
durch
gtk_timeout_add(50,(GtkFunction)terminal_test,0);
ersetzt.
Danach konnte ich das Prog zwar starten, jedoch reagiert die GUI jetzt gar nicht mehr.
Gleiches Ergebnis liefert g_idle_add();@marcin:
Ja, habe die RS232 Funktion aus dem Buch, da es für mich als Anfänger erstmal die einfachste Lösung darstellte und auch ihren Zweck erfüllt. Muß nebenbei mit anderen Funktionen auch noch auf die RS232 schreiben.
-
jedoch reagiert die GUI jetzt gar nicht mehr.
Das erhärtet den Verdacht das es an der konfiguration der seriellen Schitstelle liegt, oder die kommunikation mit dem externe Gerät klapt nicht so richtig.
Es bleibt höstwahrscheinlich an irgendeinem Aaufruf von read() oder select() hängen.erstmal die einfachste Lösung darstellte und auch ihren Zweck erfüllt.
Naja wie du siehst eben nicht.
Schau ob dien Programm immer noch hängt wenn du alle read()und select() aufrufe auskommentierts.
-
Ich habe da noch ein kleines logisches Problem.
Das Programm funtioniert ja soweit. Erst ab einem bestimmten Zeitpunkt, nachdem es beispielsweise 50 mal einen Wert von der RS232 bekommen hat, friert es ein. Allerdings läuft der thread mit der RS232 abfrage weiter.
Weiterhin kann ich meiner Meinung nach das Problem genau auf den Aufruf der Funktion gtk_entry_set_text() eingrenzen.
Wenn ich nämlich hergehe und in den entsprechenden CASES der terminal.h die Aufrufe von gtk_entry_set_text() auskommentiere (und nur diese), dann läuft das Programm stundenlang ohne einzufrieren. Dabei springt es ja auch in den jeweiligen CASE und bereitet das array WERT[] auf, nur wird es diesmal nicht ins entry geschrieben.
Also muß es doch zwangsläufig daran liegen, oder sehe ich das falsch?
-
Bist du dir sicher das das was du hier
gtk_entry_set_text (GTK_ENTRY(textfeld_kraft),wert);
ein C-String ist (endet mit null 0).
Ich sehe nämlich nirgendwo das in wert 0 geschrieben wird.
Das würde zwar nicht erklären warum das Programm hängt, aber das darf auch nicht sein.
-
Ja, da gebe ich dir Recht, habe ich in der geposteten Version nicht gemacht, habe es aber vorher mal manuell eingefügt mit wert[15]=0.
hat aber leider auch nichts geändert.
-
Wenn du willst kannst mir das ganze Programm per Email zu schicken (also am besten das ganze Verzeichnis vom Anjuta-Pojekt), ich kann nichts versprechen aber so was wie Daten über rs232 empfangen und anzeigen habe ich schon x-mal gemacht, ist eigentlich nicht schwierig. Nur aus Quellcode-Fetzen zu erraten was da nicht funktioniert ist mir schwierig.
Meine EMai: marc.in@kielnet.net
-
Email ist auf dem Weg...