|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 16.02.2011, 18:05 Titel: gtk_main() und endlosschleife aus eigenem code |
|
|
Hallo,
ich habe hier kürzlich schon einmal einen Thread eröffnet in dem mir super geholfen wurde - Danke!
Also versuche ich es mit einem weiteren Problem wieder hier - in der Hoffnung auf genau so gute Hilfe.
Zum Problem:
Ich habe eine GTK GUI die wunderbar funktioniert.
Ich habe ein Label, das zur Laufzeit geändert werden soll. Das funktioniert auch soweit.
Jetzt möchte ich aber eine Art Digitaluhr damit darstellen. Und da beginnt mein Problem.
Ich ermittle die aktuelle Zeit mit:
Dann zeige ich sie mit folgendem Code an:
Code: | gtk_label_set_text(label06, "" &Zeit) |
würde ich diese zwei Codezeilen als Endlosschleife laufen lassen ist logischerweise meine GUI lahmgelegt.
Also kam mir der naheliegende Gedanke das ganze durch Multithreading zu lösen. Da bin ich aber aber auf ziemlich viele Probleme gestoßen und das ganze scheint nicht so einfach zu sein.
Irgendwie muss man für mein Problem doch eine einfachere Lösung finden.
Ich bin bei der weiteren Recherche auf folgendes gestoßen:
Code: | g_timeout_add(100,@timeout_callback,NULL) |
Wobei timeout_callback dann die Funktion ist, in der meine obigen beiden Codezeilen laufen sollen.
Leider tut sich bei mir gar nichts...
Ich kann mir absolut nicht erklären wieso, ich kann auch in der GTK Referenz nichts finden was mir weiter hilft.
Vielleicht kann mir hier jemand auf die Sprünge helfen...
Zu einem späteren Zeitpunkt soll meine GUI auch noch Messwerte in mehreren Labels anzeigen, die über einen USB<->UART Converter an den PC gesendet werden.
Das wollte ich eigentlich ähnlich lösen...
Vielen Dank schon mal für eure Mühe! |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 16.02.2011, 19:12 Titel: Lösung |
|
|
Hallo,
ich hab wieder Erwarten doch selbst die Lösung gefunden.
Lag an einem echt dummen Fehler von mir selbst.
Wie peinlich - ich mags eigentlich gar nicht posten...
Ich hab die Codezeile
Code: | timeout1id=g_timeout_add(100,@timeout_callback,NULL) |
erst nach
geschrieben.
Als mir das eben aufgefallen ist hab ich die beiden Zeilen einfach getauscht und siehe da es funktinoniert - wunderbar
Jetzt hoffe ich nur, dass das dann mit dem Empfang der Messdaten auch so funktioniert...
Aber dazu komme ich erst in einigen Tagen.
[edit] 18:37
Ich hab gerade gelesen, dass ich folgenden Code
Code: | g_source_remove(timeout1id) |
in meine Beenden Routine, also das delete-event mit aufnehmen sollte.
Ich weiß nicht wieso ich das tun sollte - außerdem führt das beim kompilieren zu einem Fehler mit folgender Meldung:
"variable not declared, timeout1id in g_source_remove"
Wenn ich also die Codezeile weg lasse oder auskommentiere funktioniert alles bestens. Auch beim Beenden meines Programmes gibt es keine Fehler.
[edit] |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 16.02.2011, 21:57 Titel: |
|
|
Zu letzterem: Scoping für Namen bitte beachten, siehe Befehlsreferenz |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 17.02.2011, 09:36 Titel: |
|
|
@28398: Vielen Dank für den Hinweis!
Hab es eben schnell geändert und siehe da es gibt keine Fehlermeldung mehr beim kompilieren
Ich hab in der Zwischenzeit auch verstanden, wozu der Befehl dient...
Wobei bei mir auch keine Fehler aufgetreten sind wenn ich es auskommentiert hatte. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 25.02.2011, 13:21 Titel: Lösung gefunden |
|
|
Ich muss hier jetzt doch noch mal was schreiben, da ich bei dem Thema mit den Threads so meine Probleme habe.
Ich hab in den letzten Tagen mehrfach versucht in meinem GTK-Freebasic Programm die Threadfunktionen von Freebasic zu nutzen.
Dabei wollte ich gtk_main() in einen eigenen Thread packen.
Beim kompilieren treten keine Fehler auf, aber wenn ich das Programm starte erscheint die GUI nicht. Im Taskmanager von Windows sehe ich dann, dass mein Programm 96% der CPU Leistung in Anspruch nimmt.
Irgendwo habe ich glaube ich einen Denkfehler, bzw. das mit den Threads noch nicht richtig verstanden.
Wenn ich die GTK bzw GDK Threads nutzen will gibt es schon beim initialisieren ein Problem.
Und zwar mit der Zeile
Code: | g_thread_init( NULL) |
undefined reference to g_thread_init
In der Referenz steht:
"To use g_thread_init() in your program, you have to link with the libraries that the command pkg-config --libs gthread-2.0 outputs."
Ich habe am Anfang #include und dann den Pfad zur Datei eingefügt, hat aber nicht geholfen.
Evtl. kann mir damit jemand helfen.
Vielen Dank!
[edit] 13:10
(Titel angepasst)
Ich hab mir mal wieder zu allem Überfluss selbst im Weg gestanden.
Ich hab bei den Compilereinstellungen schon mehrmals versucht die .lib zu linken.
Natürlich hab ich den ganzen Pfad hingeschrieben, da sie ja nicht im Compilerverzeichnis liegt.
Dummerweise habe ich das ".lib" immer weggelassen...
Jetzt funktioniert es!
Werd mich dann am Wochenende mal dran machen mit den GTK bzw. GDK Thread Befehlen zu experimentieren.
Muss ich denn die gtk_main() in einen eigenen Thread verfrachten oder muss ich innerhalb der gtk_main() mehrere Threads anlegen?
[edit] |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 08.03.2011, 18:03 Titel: |
|
|
Hier melde ich mich mal wieder, da ich es einfach nicht hin bekomme.
Ich versuche mich an die Referenz zu halten, bekomme aber immer irgendwelche Fehler beim kompilieren.
In der gthread.bi gibt es nur
Code: | declare function g_thread_create_full (byval func as GThreadFunc, byval data as gpointer, byval stack_size as gulong, byval joinable as gboolean, byval bound as gboolean, byval priority as GThreadPriority, byval error as GError ptr ptr) as GThread ptr
|
Ich habe
Code: | declare function g_thread_create (byval func as GThreadFunc, byval data as gpointer, byval joinable as gboolean, byval error as GError ptr ptr) as GThread ptr
|
hinzugefügt.
Probleme habe ich aber auch, wenn ich g_thread_create_full verwende.
Folgende Fehlermeldung tritt auf:
Argumentcount mismatch, found "," in 'thread_create (...
bzw. ...'thread_create_full (...
Ich fange mit dieser Fehlermeldung leider nichts an.
Hoffe, hier weiß jemand, wie ich das lösen kann.
Danke. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.03.2011, 18:25 Titel: |
|
|
Die Fehlermeldung bedeutet, dass die Anzahl der übergebenen Argumente nicht stimmt. Mag sein, dass die Referenz nicht mit der dir vorliegenden Version von gthread.bi übereinstimmt? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 08.03.2011, 18:59 Titel: |
|
|
Komisch. Weil ich darauf geachtet hab, dass ich entsprechend der Referenz meinen Code aufbaue.
Code: | dim Thread1 as GThread ptr
dim shared message01 as gpointer
Thread1 = g_thread_create(timeout_callback_zeit, message01, TRUE, NULL) |
Ich hab auch in der gthread.bi nachgeschaut (habe ich unten ja schon gepostet) und mich an die Anzahl der Argumente gehalten.
Ich kann mir nicht erklären, woran es liegen könnte... |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.03.2011, 20:40 Titel: |
|
|
Ist das die Codezeile, die in der Fehlermeldung genannt wurde?
Ansonsten müsste ich mir mal das Programm im Gesamtpaket anschauen; so kann ich jetzt nicht sagen, was da schief läuft. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 08.03.2011, 23:23 Titel: |
|
|
@nemored: Ich poste morgen mal den kompletten Code. Eventuell wird es dann ersichtlich.
Ich bin bis gerade eben einfach nicht zu einer Lösung gekommen, obwohl ich alles mögliche und unmögliche versucht hab.
Bis dahin...
Grüße wwt. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 09.03.2011, 22:41 Titel: |
|
|
So, hier is der komplette Code:
Code: | '* ---------------------------------------------------------------------------
'* Program shell generated by utility 'glade2bas'
'* Dieser Programmrahmen wurde generiert durch das Werkzeug 'glade2bas'
'*
'* Generated at / Generierung am 03.02.2011 13:37
'* ---------------------------------------------------------------------------
'******************************************************************************
'* Program name: robot_control
'*
'* Version: 01-02.11
'*
'* Author: Jonathan Lorenz
'*
'* Description / Beschreibung:
'* --------------------------
'*
'* xxx
'*
'* License / Lizenz:
'* ----------------
'*
'* Please prefer the GNU GENERAL PUBLIC LICENSE to support free software
'* For more information please visit: http://www.fsf.org
'*
'* Bitte bevorzugen Sie die GNU GENERAL PUBLIC LICENSE und unterstuetzen
'* Sie mit Ihrem Programm die freie Software
'* Mehr Informationen finden Sie unter: http://www.fsf.org
'*
'*
'*
'******************************************************************************
'*
'* H I N T / H I N W E I S
'*
'* If the final application shall only show the GUI and not the command window,
'* compile the application with "fbc -s gui <progname>.bas"
'*
'* Wenn die fertige Anwendung nur im GUI-Modus laufen soll (ohne zusaetzliches
'* cmd-Fenster), einfach mit "fbc -s gui <programm>.bas" umwandeln
'*
'******************************************************************************
'* Include to be compatible with some VB commands / Ermoeglichen VB Befehle
'******************************************************************************
#include "vbcompat.bi"
'******************************************************************************
'* Includes for Gtk / Definitionen fuer Gtk
'******************************************************************************
#include "gtk/gtk.bi"
#include "gtk/libglade/glade-xml.bi"
#include "gtk/glib.bi"
'#include "cairo/cairo.bi"
'#include "crt/math.bi"
#include "gtk/glib/gthread.bi"
#define FALSE 0
'#define TRUE <>0
#define NULL 0
#define G_THREADS_ENABLED
'******************************************************************************
'* Subroutines (callbacks) or 'events' in Visual Basic notation
'* Definition der Unterprogramme bzw. 'events' in Visual Basic notation
'******************************************************************************
'1) corresponding to the signals in the glade xml file / analog zu den Signalen
' in der glade xml Datei
#include "robot_control.decl"
'2) own routines / Eigene Routinen
''declare sub xxx()
Declare Sub SendeDaten (ByVal Daten As String) 'Senderoutine COM-Port
Declare Sub Fehler 'Fehlerzähler
Declare Sub Zeitausgabe
Declare Sub Beenden
Declare Sub scrollen
DECLARE FUNCTION timeout_callback_zeit CDECL (BYVAL user_data AS gpointer) AS gboolean
'******************************************************************************
'* Data definitions / Datendefinitionen
'******************************************************************************
dim shared xml as GladeXML ptr
dim shared slash as string
dim shared robot_control_1_0 as GtkWidget ptr
dim shared Info as GtkWidget ptr
dim shared Einstellungen as GtkWidget ptr
dim shared label01 as GtkLabel ptr
dim shared label02 as GtkLabel ptr
dim shared label03 as GtkLabel ptr
dim shared label04 as GtkLabel ptr
dim shared label05 as GtkLabel ptr
dim shared label06 as GtkLabel ptr
dim shared label07 as GtkLabel ptr
dim shared label08 as GtkLabel ptr
dim shared label09 as GtkLabel ptr
dim shared label10 as GtkLabel ptr
dim shared label11 as GtkLabel ptr
dim shared label12 as GtkLabel ptr
dim shared label13 as GtkLabel ptr
dim shared label14 as GtkLabel ptr
dim shared label15 as GtkLabel ptr
dim shared label16 as GtkLabel ptr
dim shared label17 as GtkLabel ptr
dim shared label18 as GtkLabel ptr
dim shared label19 as GtkLabel ptr
dim shared label20 as GtkLabel ptr
dim shared layout1 as GtkLayout ptr
dim shared layout2 as GtkLayout ptr
dim shared layout3 as GtkLayout ptr
dim shared menubar1 as GtkMenuBar ptr
dim shared menu1 as GtkMenu ptr
dim shared menu2 as GtkMenu ptr
dim shared menu3 as GtkMenu ptr
dim shared viewport1 as GtkViewport ptr
dim shared eventbox01 as GtkEventBox ptr
dim shared eventbox02 as GtkEventBox ptr
dim shared eventbox03 as GtkEventBox ptr
dim shared eventbox04 as GtkEventBox ptr
dim shared eventbox05 as GtkEventBox ptr
dim shared eventbox06 as GtkEventBox ptr
dim shared eventbox07 as GtkEventBox ptr
dim shared eventbox08 as GtkEventBox ptr
dim shared eventbox09 as GtkEventBox ptr
dim shared eventbox10 as GtkEventBox ptr
dim shared button2 as GtkButton ptr
dim shared textview1 as GtkWidget ptr
dim shared widgetbuff as GtkTextBuffer ptr
dim shared Farbe as GdkColor
dim shared parent as GtkWindow ptr
dim shared answer as Integer
dim shared messagedialog as GtkWidget ptr
dim shared scrolledwindow1 as GtkScrolledWindow ptr
Const COMPort = "COM2:19200,N,8,1,ME,CS0,DS0,RS" 'COM2 ggf. durch andere Portnummer ersetzen
dim shared BytesGesendet As Integer = 0
dim shared FehlerAnz As Byte = 0 'als Zählervariable für die Anzahl der aufgetretenen Fehler seit Programmstart
dim shared Zeit as String 'Variable zur Systemzeitermittlung
dim shared outbuff as String
dim shared v_adj as Byte
dim shared iter as GtkTextIter ptr
dim shared mark as GtkTextMark ptr
dim shared as guint timeout1id
timeout1id=g_timeout_add(50,@timeout_callback_zeit,NULL) 'timeoutfunktion zur kontinuierlichen Systemzeitermittlung und Ausgabe
'dim Thread1 as GThread ptr
'Thread1 = g_thread_create(@timeout_callback_zeit, NULL, TRUE, NULL)
'******************************************************************************
'*
'* =========================
'* START OF THE MAIN PROGRAM
'* BEGINN DES HAUPTPROGRAMMS
'* =========================
'*
'******************************************************************************
'******************************************************************************
'* Choose correct slash for the OS / Betriebssystemabhängiger Pfadbezeichner
'******************************************************************************
slash = "/"
#ifdef __FB_WIN32__
'...instructions only for Win32...
slash = "\"
#endif
'******************************************************************************
'* Initialize Gtk / GUI (Gtk) initialisieren
'******************************************************************************
g_thread_init( NULL)
gdk_threads_init()
gdk_threads_enter()
gtk_init( NULL, NULL )
'******************************************************************************
'* Specify the windows to be shown / Anzuzeigende Fenster spezifizieren
'******************************************************************************
xml = glade_xml_new( "robot_control.glade", NULL, NULL )
'******************************************************************************
'* Reference some widgets / Fenster+Felder referenzieren
'******************************************************************************
robot_control_1_0 = glade_xml_get_widget( xml, "robot_control_1_0" )
Info = glade_xml_get_widget( xml, "Info" )
Einstellungen = glade_xml_get_widget( xml, "Einstellungen" )
label01 = glade_xml_get_widget( xml, "label01") 'verfügbar machen von label01 - label20
label02 = glade_xml_get_widget( xml, "label02")
label03 = glade_xml_get_widget( xml, "label03")
label04 = glade_xml_get_widget( xml, "label04")
label05 = glade_xml_get_widget( xml, "label05")
label06 = glade_xml_get_widget( xml, "label06")
label07 = glade_xml_get_widget( xml, "label07")
label08 = glade_xml_get_widget( xml, "label08")
label09 = glade_xml_get_widget( xml, "label09")
label10 = glade_xml_get_widget( xml, "label10")
label11 = glade_xml_get_widget( xml, "label11")
label12 = glade_xml_get_widget( xml, "label12")
label13 = glade_xml_get_widget( xml, "label13")
label14 = glade_xml_get_widget( xml, "label14")
label15 = glade_xml_get_widget( xml, "label15")
label16 = glade_xml_get_widget( xml, "label16")
label17 = glade_xml_get_widget( xml, "label17")
label18 = glade_xml_get_widget( xml, "label18")
label19 = glade_xml_get_widget( xml, "label19")
label20 = glade_xml_get_widget( xml, "label20")
layout1 = glade_xml_get_widget( xml, "layout1") 'verfügbar machen von layout1 - layout3
layout2 = glade_xml_get_widget( xml, "layout2")
layout3 = glade_xml_get_widget( xml, "layout3")
menubar1 = glade_xml_get_widget( xml, "menubar1") 'verfügbar machen von manubar1 sowie von menu1 - menu3
menu1 = glade_xml_get_widget( xml, "menu1")
menu2 = glade_xml_get_widget( xml, "menu2")
menu3 = glade_xml_get_widget( xml, "menu3")
viewport1 = glade_xml_get_widget (xml, "viewport1") 'verfügbarmachen von viewport1
eventbox01 = glade_xml_get_widget( xml, "eventbox01") 'verfügbar machen von eventbox01 - eventbox10
eventbox02 = glade_xml_get_widget( xml, "eventbox02") 'zur Konfiguartion der Hintergründe von label01 - label10
eventbox03 = glade_xml_get_widget( xml, "eventbox03")
eventbox04 = glade_xml_get_widget( xml, "eventbox04")
eventbox05 = glade_xml_get_widget( xml, "eventbox05")
eventbox06 = glade_xml_get_widget( xml, "eventbox06")
eventbox07 = glade_xml_get_widget( xml, "eventbox07")
eventbox08 = glade_xml_get_widget( xml, "eventbox08")
eventbox09 = glade_xml_get_widget( xml, "eventbox09")
eventbox10 = glade_xml_get_widget( xml, "eventbox10")
button2 = glade_xml_get_widget( xml, "button2")
scrolledwindow1 = glade_xml_get_widget( xml, "scrolledwindow1") 'verfügbar machen von scrolledwindow1
textview1 = glade_xml_get_widget( xml, "textview1") 'verfügbar machen von textview1
widgetbuff = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview1)) 'verfügbar machen von widgetbuff, was dem Textbuffer von textview1 entspricht
'benötigt um Text in textview1 ausgeben zu können
'Initialize r/g/b components, they are 16-bit values
'8 bit RGB Werte mit 257 multipliziert ergibt den 16 bit Wert,
'weil 255 * 257 = 65535
Farbe.red = 155 * 257
Farbe.green = 238 * 257
Farbe.blue = 62 * 257
gtk_widget_modify_bg (menubar1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 140 * 257
Farbe.green = 208 * 257
Farbe.blue = 0 * 257
gtk_widget_modify_bg (layout1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 255 * 257
Farbe.blue = 102 * 257
gtk_widget_modify_bg (layout2, GTK_STATE_NORMAL, @ Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 153 * 257
gtk_widget_modify_bg (layout3, GTK_STATE_NORMAL, @ Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (viewport1, GTK_STATE_NORMAL, @ Farbe)
Farbe.red = 206 * 257
Farbe.green = 222 * 257
Farbe.blue = 254 * 257
gtk_widget_modify_base (textview1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 76 * 257
gtk_widget_modify_bg (menu1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 76 * 257
gtk_widget_modify_bg (menu2, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 76 * 257
gtk_widget_modify_bg (menu3, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox01, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox02, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox03, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox04, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox05, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox06, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox07, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox08, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox09, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox10, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 206 * 257
Farbe.green = 222 * 257
Farbe.blue = 254 * 257
gtk_widget_modify_bg (button2, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 142 * 257
Farbe.green = 229 * 257
Farbe.blue = 238 * 257
gtk_widget_modify_bg (button2, GTK_STATE_PRELIGHT, @Farbe)
'******************************************************************************
'* Display main window(s) / Hauptfenster anzeigen
'******************************************************************************
gtk_widget_show_all( robot_control_1_0)
gtk_widget_hide ( Einstellungen)
gtk_widget_hide ( Info)
glade_xml_signal_autoconnect( xml )
'******************************************************************************
'* The main GUI loop starts / Hier beginnt die eigentliche GUI-Verarbeitung
'* ------------------------------------------------------------------------
'*
'* I M P O R T A N T / W I C H T I G :
'*
'* gtk_main can only be terminated by function gtk_main_quit(), so remember to
'* define a signal to quit the application and call gtk_main_quit() in the
'* associated SUB - e.g. by signal on_xxx_delete_event (xxx = window name)
'*
'* gtk_main kann nur durch die Funktion gtk_main_quit() beendet werden, daher
'* nicht vergessen, ein Signal zum Beenden der Anwendung zu definieren und
'* in der zugehörigen SUB die Funktion gtk_main_quit() aufzurufen - z.B. durch
'* das Signal on_xxx_delete_event (xxx = Name des Fensters)
'*
'******************************************************************************
Zeitausgabe
gdk_threads_enter ()
outbuff = outbuff + Zeit + " interface started succsessfully" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
gdk_threads_leave ()
scrollen
gtk_main( )
'******************************************************************************
'* Wrap up / Abschliessende Schritte
'******************************************************************************
' a) unattach xml reference / xml Referenz abbauen
g_object_unref( xml )
' b) end Threads
gdk_threads_leave ()
' c) Finish program with return code 0 / Programm mit Returncode 0 beenden
end 0
'******************************************************************************
'*
'* =======================
'* END OF THE MAIN PROGRAM
'* ENDE DES HAUPTPROGRAMMS
'* =======================
'*
'******************************************************************************
'------------------------------------------------------------------------------
' now the SUB programs start ... / ab hier Unterprogramme (SUB's) ...
'------------------------------------------------------------------------------
sub on_robot_control_1_0_delete_event cdecl alias "on_robot_control_1_0_delete_event" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_robot_control_1_0_delete_event
'******************************************************************************
Beenden
end sub
sub on_go_clicked cdecl alias "on_go_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_go_clicked
'******************************************************************************
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox01, GTK_STATE_NORMAL, @Farbe)
gtk_label_set_text(label01, "running")
Zeitausgabe
outbuff = outbuff + Zeit + " button pressed [go]" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
scrollen
If (Open Com ( COMPort For Binary As #1 ) <> 0 ) Then
'Print "Fehler: Der Port konnte nicht geoeffnet werden!"
Else
'Print "COM-Port geoeffnet"
'Sleep 100
SendeDaten ("go"+chr(10)) 'NT mit anschliessendem <LF>
'Print TIME & " Insgesamt bisher " & BytesGesendet & " Bytes gesendet."
'Sleep 200
Close #1
'Print "COM-Port geschlossen"
End If
end sub
sub on_stop_clicked cdecl alias "on_stop_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_stop_clicked
'******************************************************************************
Farbe.red = 255 * 257
Farbe.green = 10 * 257
Farbe.blue = 0 * 257
gtk_widget_modify_bg (eventbox01, GTK_STATE_NORMAL, @Farbe)
gtk_label_set_text(label01, "stopped")
Zeitausgabe
outbuff = outbuff + Zeit + " button pressed [stop]" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
scrollen
If (Open Com ( COMPort For Binary As #1 ) <> 0 ) Then
'Print "Fehler: Der Port konnte nicht geoeffnet werden!"
Else
'Print "COM-Port geoeffnet"
'Sleep 100
SendeDaten ("stop"+chr(10)) 'NT mit anschliessendem <LF>
'Print TIME & " Insgesamt bisher " & BytesGesendet & " Bytes gesendet."
'Sleep 200
Close #1
'Print "COM-Port geschlossen"
End If
end sub
sub on_imagemenuitem_Beenden_activate cdecl alias "on_imagemenuitem_Beenden_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Beenden_activate
'******************************************************************************
Beenden
end sub
sub on_imagemenuitem_Einstellungen_activate cdecl alias "on_imagemenuitem_Einstellungen_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Einstellungen_activate
'******************************************************************************
Fehler
gtk_widget_show_all( Einstellungen)
end sub
sub on_imagemenuitem_Verbinden_activate cdecl alias "on_imagemenuitem_Verbinden_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Verbinden_activate
'******************************************************************************
Fehler
gtk_widget_show_all( Einstellungen)
end sub
sub on_imagemenuitem_Trennen_activate cdecl alias "on_imagemenuitem_Trennen_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Trennen_activate
'******************************************************************************
Fehler
gtk_widget_show_all( Einstellungen)
end sub
sub on_imagemenuitem_Info_activate cdecl alias "on_imagemenuitem_Info_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Info_activate
'******************************************************************************
gtk_widget_show_all( Info)
end sub
sub on_Info_delete_event cdecl alias "on_Info_delete_event" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_Info_delete_event
'******************************************************************************
gtk_widget_hide_on_delete( Info)
end sub
sub on_button1_clicked cdecl alias "on_button1_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_button1_clicked
'******************************************************************************
gtk_widget_hide( Info)
end sub
sub on_Einstellungen_delete_event cdecl alias "on_Einstellungen_delete_event" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_Einstellungen_delete_event
'******************************************************************************
gtk_widget_hide_on_delete( Einstellungen)
end sub
sub on_button2_clicked cdecl alias "on_button2_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_button2_clicked
'******************************************************************************
gtk_widget_hide( Einstellungen)
end sub
'******************************************************************************
'* put your code below for own subroutines
'******************************************************************************
sub SendeDaten (ByVal Daten As String)
Dim i As Integer
Dim Z As String
For i = 1 To Len(Daten) 'Daten zeichenweise ueber Port senden
Z = Mid(Daten,i,1)
Put #1,,Z
'Sleep 10 'ggf. kurze Pause? Vermutlich nicht noetig. Abhaengig von Gegenstelle.
Next
BytesGesendet += Len(Daten)
end Sub
sub Fehler
FehlerAnz = FehlerAnz+1 'Fehleranzahl um 1 erhöhen
gtk_label_set_text(label05, "" &FehlerAnz) 'aktuelle Fehleranzahl in GUI/label05 ausgeben
Zeitausgabe
outbuff = outbuff + Zeit + " Fehler (" &FehlerAnz & ")" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
scrollen
end sub
sub Zeitausgabe
Zeit = Time
end sub
sub Beenden
messagedialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Wollen sie wirklich beenden?")
Farbe.red = 206 * 257
Farbe.green = 222 * 257
Farbe.blue = 254 * 257
gtk_widget_modify_bg (messagedialog, GTK_STATE_NORMAL, @Farbe)
parent = GTK_WINDOW (robot_control_1_0)
gtk_window_set_transient_for (GTK_WINDOW(messagedialog), parent)
answer = gtk_dialog_run (GTK_DIALOG (messagedialog))
gtk_widget_destroy (messagedialog)
if answer = GTK_RESPONSE_YES then
g_source_remove(timeout1id)
gtk_main_quit () 'quits the GUI processing / beendet die GUI-Verarbeitung
else
gtk_widget_show_all( robot_control_1_0 ) 'show the destroyed window again
end if
end sub
sub scrollen
gdk_threads_enter ()
mark = gtk_text_buffer_get_insert (widgetbuff)
gtk_text_buffer_get_iter_at_mark(widgetbuff, iter, mark)
gtk_text_buffer_insert(widgetbuff, iter, outbuff, -1)
gtk_text_view_scroll_mark_onscreen(gtk_TEXT_VIEW(textview1), mark)
gdk_threads_leave ()
end sub
FUNCTION timeout_callback_zeit CDECL (BYVAL user_data AS gpointer) AS gboolean
Zeitausgabe
gdk_threads_enter ()
gtk_label_set_text(label06, "" &Zeit)
gdk_threads_leave ()
return TRUE
end FUNCTION
|
Die Anzeige der Uhrzeit habe ich ja momentan durch einen Timeout gelöst. Das funktioniert so weit auch super.
Jetzt möchte ich diese Funktion aber in einen eigenen Thread packen. Das ganze mache ich eigentlich um grundsätzlich mit Multithreading in GTK klar zu kommen.
Multithreading benötige ich, um einen Thread zu erstellen, der Daten vom COM-Port empfängt. Und zwar kontinuierlich. Dabei handelt es sich um Daten der Sensoren eines Roboters. Bewegungsrichtung von einem Kompassmodul, Distanzdaten von Sharp IR Sensoren, Geschwindigkeitsdaten von Encodern und Die aktuelle Spannung des Akkus.
Falls nötig kann ich die .glade.xml Datei auch noch posten.
Vielen Dank für alle, die sich die Mühe machen den Code zu durchforsten!
Grüße wwt. |
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 10.03.2011, 01:43 Titel: |
|
|
bei dir:
Code: | DECLARE FUNCTION timeout_callback_zeit CDECL (BYVAL user_data AS gpointer) AS gboolean |
in gthread.bi
Code: | type GThreadFunc as function cdecl(byval as gpointer) as gpointer |
bei dir ist die rueckgabe gboolean aber es wird ein gpointer erwatet.
ich weiss nicht ob das der fehler war.
ansonnsten kannst du folgendes versuchen, wenn du sicher bist, das alles stimmt:
anstelle von
Code: | Thread1 = g_thread_create(@timeout_callback_zeit, NULL, TRUE, NULL) |
Code: | Asm
push NULL
push TRUE
push NULL
push offset _TIMEOUT_CALLBACK_ZEIT
Call _G_THREAD_CREATE
mov [Thread1], eax
End Asm |
dabei umgehst du die kontrolle vom FB-Compiler |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 10.03.2011, 10:18 Titel: |
|
|
Danke für die schnelle Antwort.
Ich habe natürlich gboolean gegen gppointer getauscht. (Im Moment ist ja die Lösung mit dem Timeout aktiv.)
Das hat mir aber nicht geholfen. Werde es aber heute abend noch mal versuchen. Evtl. habe ich irgendwas übersehen. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 11.03.2011, 23:21 Titel: |
|
|
Ich hab das ganze jetzt noch mal versucht und habe festgestellt, dass trotz Anpassung der gthread.bi die Sache mit dem
nicht funktioniert.
Hab das Ganze dann mit
Code: | g_thread_create_full() |
gelöst, was beim kompilieren zu keinen Fehlern führt. Soweit so gut.
Dafür hab ich dann beim Ausführen meines Programmes folgende Fehlermeldung:
Kann mir jemand einen Tip geben, was ich dagegen unternehmen kann?
Irgendwie scheint es ja am initialisieren des Threadsystems zu liegen. Dabei habe ich mich aber genau an die Referenz gehalten. Ich kann mir nicht erklären warum das nicht funktioniert... Der Compiler meckert ja auch nicht.
Grüße wwt.
[edit] 22:38
Ich hab gerade festgestellt, dass ich folgende Code Zeile:
Code: | Thread1 = g_thread_create_full(@timeout_callback_zeit, NULL, NULL, TRUE, NULL, G_THREAD_PRIORITY_NORMAL, NULL)
|
geschrieben habe bevor ich das Thread System initialisiert habe.
Das habe ich jetzt geändert und siehe da, die Fehlermeldung bleibt aus und mein Programm startet.
Lediglich der Thread macht mir noch Probleme. Erst dachte ich er läuft nicht richtig, da die Uhrzeit sich nicht verändert hat.
Is aber logisch, da die Funktion ja nur ein Mal abgehandelt wird.
Kann ich innerhalb des Threads auch ein Timeout verwenden?
Weil ich kann innerhalb der Funktion ja kein
verwenden.
Ich hab meine Funktion mal 10-fach hintereinander gesetzt mit
dazwischen.
Dadurch habe ich sehen können, dass der Thread läuft und dass der Rest der Anwendung wie erwartet unabhängig funktioniert!
[edit]
[edit] 22:56
So, ich hab es jetzt.
Mit einer
Schleife funktionniert das doch ganz wunderbar.
War also falscher Alarm vorhin.
Die Uhrzeit läuft. Die GUI läuft, die Eingaben laufen flüssig.
Jetzt bin ich nur noch gespannt, wie das dann demnächst mit dem Datenempfang über den COM-Port läuft. Ich hoffe genau so flüssig!
Ich werde demnächst noch mal den aktuellen Code posten in dem die Thread Geschichte läuft.
Grüße wwt. |
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 12.03.2011, 00:03 Titel: |
|
|
Zitat: | Weil ich kann innerhalb der Funktion ja kein
Code:
loop
verwenden. |
Wieso den das? Ich dachte immer wenn man einen Thread erzeugt leuft er parallel zum program, kann also loops haben und wird gleichzeitig ausgefuert. oder ist das bei GTK anderst als bei ThreadCreate in FB
Edit: Sehe gerade, das du es selbst herausgefunden hast. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 12.03.2011, 00:22 Titel: |
|
|
Hey XOR,
danke für deine Antwort.
Ich war da kurzfristig auf dem Holzweg mit meinen Gedanken...
Natürlich funktioniert das mit den Threads vom Prinzip her bei GDK+ so wie auch bei FB. Mit den Loops is das also gar kein Problem.
grüße wwt. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 13.03.2011, 20:15 Titel: |
|
|
So, hier ist mal der aktuelle Code. 4 Threads laufen parallel.
So richtig viel Sinn hat das Ganze noch nicht. Es dient momentan nur mal dazu, zu sehen, dass alle Threads unabhängig voneinander parallel arbeiten.
Die momentan in den jeweiligen Threads erzeugten Werte kommen ja apäter über einen virtuellen Com-Port über einen UART to USB Adapter.
Bzw. letztendlich über einen RFM12-433MHz to USB Adapter.
Code: | '* ---------------------------------------------------------------------------
'* Program shell generated by utility 'glade2bas'
'* Dieser Programmrahmen wurde generiert durch das Werkzeug 'glade2bas'
'*
'* Generated at / Generierung am 03.02.2011 13:37
'* ---------------------------------------------------------------------------
'******************************************************************************
'* Program name: robot_control
'*
'* Version: 01-11.03
'*
'* Author: Jonathan Lorenz
'*
'* Description / Beschreibung:
'* --------------------------
'*
'* xxx
'*
'* License / Lizenz:
'* ----------------
'*
'* Please prefer the GNU GENERAL PUBLIC LICENSE to support free software
'* For more information please visit: http://www.fsf.org
'*
'* Bitte bevorzugen Sie die GNU GENERAL PUBLIC LICENSE und unterstuetzen
'* Sie mit Ihrem Programm die freie Software
'* Mehr Informationen finden Sie unter: http://www.fsf.org
'*
'*
'*
'******************************************************************************
'*
'* H I N T / H I N W E I S
'*
'* If the final application shall only show the GUI and not the command window,
'* compile the application with "fbc -s gui <progname>.bas"
'*
'* Wenn die fertige Anwendung nur im GUI-Modus laufen soll (ohne zusaetzliches
'* cmd-Fenster), einfach mit "fbc -s gui <programm>.bas" umwandeln
'*
'******************************************************************************
'* Include to be compatible with some VB commands / Ermoeglichen VB Befehle
'******************************************************************************
#include "vbcompat.bi"
'******************************************************************************
'* Includes for Gtk / Definitionen fuer Gtk
'******************************************************************************
#include "gtk/gtk.bi"
#include "gtk/libglade/glade-xml.bi"
#include "gtk/glib.bi"
'#include "cairo/cairo.bi"
'#include "crt/math.bi"
#include "gtk/glib/gthread.bi"
#define FALSE 0
'#define TRUE <>0
#define NULL 0
#define G_THREADS_ENABLED
'******************************************************************************
'* Subroutines (callbacks) or 'events' in Visual Basic notation
'* Definition der Unterprogramme bzw. 'events' in Visual Basic notation
'******************************************************************************
'1) corresponding to the signals in the glade xml file / analog zu den Signalen
' in der glade xml Datei
#include "robot_control.decl"
'2) own routines / Eigene Routinen
''declare sub xxx()
Declare Sub SendeDaten (ByVal Daten As String) 'Senderoutine COM-Port
Declare Sub Fehler 'Fehlerzähler
Declare Sub Zeitausgabe
Declare Sub Beenden
Declare Sub scrollen
Declare Function timeout_callback_zeit CDECL (BYVAL user_data AS gpointer) AS gpointer 'AS gboolean '(bei Verwendung von timeout)
Declare Function robot_direction CDECL (BYVAL user_data AS gpointer) AS gpointer
Declare Function robot_voltage CDECL (BYVAL user_data AS gpointer) AS gpointer
Declare Function robot_distance CDECL (BYVAL user_data AS gpointer) AS gpointer
'******************************************************************************
'* Data definitions / Datendefinitionen
'******************************************************************************
dim shared xml as GladeXML ptr
dim shared slash as string
dim shared robot_control_1_0 as GtkWidget ptr
dim shared Info as GtkWidget ptr
dim shared Einstellungen as GtkWidget ptr
dim shared label01 as GtkLabel ptr
dim shared label02 as GtkLabel ptr
dim shared label03 as GtkLabel ptr
dim shared label04 as GtkLabel ptr
dim shared label05 as GtkLabel ptr
dim shared label06 as GtkLabel ptr
dim shared label07 as GtkLabel ptr
dim shared label08 as GtkLabel ptr
dim shared label09 as GtkLabel ptr
dim shared label10 as GtkLabel ptr
dim shared label11 as GtkLabel ptr
dim shared label12 as GtkLabel ptr
dim shared label13 as GtkLabel ptr
dim shared label14 as GtkLabel ptr
dim shared label15 as GtkLabel ptr
dim shared label16 as GtkLabel ptr
dim shared label17 as GtkLabel ptr
dim shared label18 as GtkLabel ptr
dim shared label19 as GtkLabel ptr
dim shared label20 as GtkLabel ptr
dim shared layout1 as GtkLayout ptr
dim shared layout2 as GtkLayout ptr
dim shared layout3 as GtkLayout ptr
dim shared menubar1 as GtkMenuBar ptr
dim shared menu1 as GtkMenu ptr
dim shared menu2 as GtkMenu ptr
dim shared menu3 as GtkMenu ptr
dim shared viewport1 as GtkViewport ptr
dim shared eventbox01 as GtkEventBox ptr
dim shared eventbox02 as GtkEventBox ptr
dim shared eventbox03 as GtkEventBox ptr
dim shared eventbox04 as GtkEventBox ptr
dim shared eventbox05 as GtkEventBox ptr
dim shared eventbox06 as GtkEventBox ptr
dim shared eventbox07 as GtkEventBox ptr
dim shared eventbox08 as GtkEventBox ptr
dim shared eventbox09 as GtkEventBox ptr
dim shared eventbox10 as GtkEventBox ptr
dim shared button2 as GtkButton ptr
dim shared textview1 as GtkWidget ptr
dim shared widgetbuff as GtkTextBuffer ptr
dim shared Farbe as GdkColor
dim shared parent as GtkWindow ptr
dim shared answer as Integer
dim shared messagedialog as GtkWidget ptr
dim shared scrolledwindow1 as GtkScrolledWindow ptr
Const COMPort = "COM2:19200,N,8,1,ME,CS0,DS0,RS" 'COM2 ggf. durch andere Portnummer ersetzen
dim shared BytesGesendet As Integer = 0
dim shared FehlerAnz As Byte = 0 'als Zählervariable für die Anzahl der aufgetretenen Fehler seit Programmstart
dim shared Zeit as String 'Variable zur Systemzeitermittlung
dim shared outbuff as String
dim shared v_adj as Byte
dim shared iter as GtkTextIter ptr
dim shared mark as GtkTextMark ptr
dim shared i1 as Integer = 0
dim shared direction as Double = 0.00 'für Bewegungsrichtung in °
dim shared direction2 as String
dim shared i2 as Integer = 0
dim shared i22 as Integer = 0
dim shared voltage as Double = 0.00
dim shared voltage3 as String
dim shared i3 as Integer = 0
dim shared i33 as Integer = 0
dim shared distance as Double = 3.000
dim shared distance4 as String
dim shared i4 as Integer = 0
dim shared i44 as Integer = 0
'dim shared as guint timeout1id
' timeout1id=g_timeout_add(50,@timeout_callback_zeit,NULL) 'timeoutfunktion zur kontinuierlichen Systemzeitermittlung und Ausgabe
dim Thread1 as GThread ptr 'Thread zur kontinuierlichen Systemzeitermittlung und Ausgabe
dim Thread2 as GThread ptr 'Thread zur Anzeige der Bewegungsrichtung (Grundlage: Daten vom Kompassmodul)
dim Thread3 as GThread ptr
dim Thread4 as GThread ptr
'******************************************************************************
'*
'* =========================
'* START OF THE MAIN PROGRAM
'* BEGINN DES HAUPTPROGRAMMS
'* =========================
'*
'******************************************************************************
'******************************************************************************
'* Choose correct slash for the OS / Betriebssystemabhängiger Pfadbezeichner
'******************************************************************************
slash = "/"
#ifdef __FB_WIN32__
'...instructions only for Win32...
slash = "\"
#endif
'******************************************************************************
'* Initialize Gtk / GUI (Gtk) initialisieren
'******************************************************************************
g_thread_init( NULL)
gdk_threads_init()
gdk_threads_enter()
gtk_init( NULL, NULL )
'******************************************************************************
'* Specify the windows to be shown / Anzuzeigende Fenster spezifizieren
'******************************************************************************
xml = glade_xml_new( "robot_control.glade", NULL, NULL )
'******************************************************************************
'* Reference some widgets / Fenster+Felder referenzieren
'******************************************************************************
robot_control_1_0 = glade_xml_get_widget( xml, "robot_control_1_0" )
Info = glade_xml_get_widget( xml, "Info" )
Einstellungen = glade_xml_get_widget( xml, "Einstellungen" )
label01 = glade_xml_get_widget( xml, "label01") 'verfügbar machen von label01 - label20
label02 = glade_xml_get_widget( xml, "label02")
label03 = glade_xml_get_widget( xml, "label03")
label04 = glade_xml_get_widget( xml, "label04")
label05 = glade_xml_get_widget( xml, "label05")
label06 = glade_xml_get_widget( xml, "label06")
label07 = glade_xml_get_widget( xml, "label07")
label08 = glade_xml_get_widget( xml, "label08")
label09 = glade_xml_get_widget( xml, "label09")
label10 = glade_xml_get_widget( xml, "label10")
label11 = glade_xml_get_widget( xml, "label11")
label12 = glade_xml_get_widget( xml, "label12")
label13 = glade_xml_get_widget( xml, "label13")
label14 = glade_xml_get_widget( xml, "label14")
label15 = glade_xml_get_widget( xml, "label15")
label16 = glade_xml_get_widget( xml, "label16")
label17 = glade_xml_get_widget( xml, "label17")
label18 = glade_xml_get_widget( xml, "label18")
label19 = glade_xml_get_widget( xml, "label19")
label20 = glade_xml_get_widget( xml, "label20")
layout1 = glade_xml_get_widget( xml, "layout1") 'verfügbar machen von layout1 - layout3
layout2 = glade_xml_get_widget( xml, "layout2")
layout3 = glade_xml_get_widget( xml, "layout3")
menubar1 = glade_xml_get_widget( xml, "menubar1") 'verfügbar machen von manubar1 sowie von menu1 - menu3
menu1 = glade_xml_get_widget( xml, "menu1")
menu2 = glade_xml_get_widget( xml, "menu2")
menu3 = glade_xml_get_widget( xml, "menu3")
viewport1 = glade_xml_get_widget (xml, "viewport1") 'verfügbarmachen von viewport1
eventbox01 = glade_xml_get_widget( xml, "eventbox01") 'verfügbar machen von eventbox01 - eventbox10
eventbox02 = glade_xml_get_widget( xml, "eventbox02") 'zur Konfiguartion der Hintergründe von label01 - label10
eventbox03 = glade_xml_get_widget( xml, "eventbox03")
eventbox04 = glade_xml_get_widget( xml, "eventbox04")
eventbox05 = glade_xml_get_widget( xml, "eventbox05")
eventbox06 = glade_xml_get_widget( xml, "eventbox06")
eventbox07 = glade_xml_get_widget( xml, "eventbox07")
eventbox08 = glade_xml_get_widget( xml, "eventbox08")
eventbox09 = glade_xml_get_widget( xml, "eventbox09")
eventbox10 = glade_xml_get_widget( xml, "eventbox10")
button2 = glade_xml_get_widget( xml, "button2")
scrolledwindow1 = glade_xml_get_widget( xml, "scrolledwindow1") 'verfügbar machen von scrolledwindow1
textview1 = glade_xml_get_widget( xml, "textview1") 'verfügbar machen von textview1
widgetbuff = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview1)) 'verfügbar machen von widgetbuff, was dem Textbuffer von textview1 entspricht
'benötigt um Text in textview1 ausgeben zu können
'Initialize r/g/b components, they are 16-bit values
'8 bit RGB Werte mit 257 multipliziert ergibt den 16 bit Wert,
'weil 255 * 257 = 65535
Farbe.red = 155 * 257
Farbe.green = 238 * 257
Farbe.blue = 62 * 257
gtk_widget_modify_bg (menubar1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 140 * 257
Farbe.green = 208 * 257
Farbe.blue = 0 * 257
gtk_widget_modify_bg (layout1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 255 * 257
Farbe.blue = 102 * 257
gtk_widget_modify_bg (layout2, GTK_STATE_NORMAL, @ Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 153 * 257
gtk_widget_modify_bg (layout3, GTK_STATE_NORMAL, @ Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (viewport1, GTK_STATE_NORMAL, @ Farbe)
Farbe.red = 206 * 257
Farbe.green = 222 * 257
Farbe.blue = 254 * 257
gtk_widget_modify_base (textview1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 76 * 257
gtk_widget_modify_bg (menu1, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 76 * 257
gtk_widget_modify_bg (menu2, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 255 * 257
Farbe.green = 254 * 257
Farbe.blue = 76 * 257
gtk_widget_modify_bg (menu3, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox01, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox02, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox03, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox04, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox05, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox06, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox07, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox08, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox09, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox10, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 206 * 257
Farbe.green = 222 * 257
Farbe.blue = 254 * 257
gtk_widget_modify_bg (button2, GTK_STATE_NORMAL, @Farbe)
Farbe.red = 142 * 257
Farbe.green = 229 * 257
Farbe.blue = 238 * 257
gtk_widget_modify_bg (button2, GTK_STATE_PRELIGHT, @Farbe)
'******************************************************************************
'* Display main window(s) / Hauptfenster anzeigen
'******************************************************************************
gtk_widget_show_all( robot_control_1_0)
gtk_widget_hide ( Einstellungen)
gtk_widget_hide ( Info)
glade_xml_signal_autoconnect( xml )
'******************************************************************************
'* The main GUI loop starts / Hier beginnt die eigentliche GUI-Verarbeitung
'* ------------------------------------------------------------------------
'*
'* I M P O R T A N T / W I C H T I G :
'*
'* gtk_main can only be terminated by function gtk_main_quit(), so remember to
'* define a signal to quit the application and call gtk_main_quit() in the
'* associated SUB - e.g. by signal on_xxx_delete_event (xxx = window name)
'*
'* gtk_main kann nur durch die Funktion gtk_main_quit() beendet werden, daher
'* nicht vergessen, ein Signal zum Beenden der Anwendung zu definieren und
'* in der zugehörigen SUB die Funktion gtk_main_quit() aufzurufen - z.B. durch
'* das Signal on_xxx_delete_event (xxx = Name des Fensters)
'*
'******************************************************************************
'******************************************************************************
'* erstellen von Threads (vorher bereits definiert)
'******************************************************************************
Thread1 = g_thread_create_full(@timeout_callback_zeit, NULL, NULL, TRUE, NULL, G_THREAD_PRIORITY_NORMAL, NULL)
Thread2 = g_thread_create_full(@robot_direction, NULL, NULL, TRUE, NULL, G_THREAD_PRIORITY_NORMAL, NULL)
Thread3 = g_thread_create_full(@robot_voltage, NULL, NULL, TRUE, NULL, G_THREAD_PRIORITY_NORMAL, NULL)
Thread4 = g_thread_create_full(@robot_distance, NULL, NULL, TRUE, NULL, G_THREAD_PRIORITY_NORMAL, NULL)
'******************************************************************************
'******************************************************************************
Zeitausgabe
gdk_threads_enter ()
outbuff = outbuff + Zeit + " interface started succsessfully" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
gdk_threads_leave ()
scrollen
'******************************************************************************
'******************************************************************************
gtk_main( )
'******************************************************************************
'* Wrap up / Abschliessende Schritte
'******************************************************************************
' a) unattach xml reference / xml Referenz abbauen
g_object_unref( xml )
' b) end Threads
gdk_threads_leave ()
' c) Finish program with return code 0 / Programm mit Returncode 0 beenden
end 0
'******************************************************************************
'*
'* =======================
'* END OF THE MAIN PROGRAM
'* ENDE DES HAUPTPROGRAMMS
'* =======================
'*
'******************************************************************************
'------------------------------------------------------------------------------
' now the SUB programs start ... / ab hier Unterprogramme (SUB's) ...
'------------------------------------------------------------------------------
sub on_robot_control_1_0_delete_event cdecl alias "on_robot_control_1_0_delete_event" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_robot_control_1_0_delete_event
'******************************************************************************
Beenden
end sub
sub on_go_clicked cdecl alias "on_go_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_go_clicked
'******************************************************************************
Farbe.red = 173 * 257
Farbe.green = 255 * 257
Farbe.blue = 47 * 257
gtk_widget_modify_bg (eventbox01, GTK_STATE_NORMAL, @Farbe)
gtk_label_set_text(label01, "running")
Zeitausgabe
outbuff = outbuff + Zeit + " button pressed [go]" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
scrollen
If (Open Com ( COMPort For Binary As #1 ) <> 0 ) Then
'Print "Fehler: Der Port konnte nicht geoeffnet werden!"
Else
'Print "COM-Port geoeffnet"
'Sleep 100
SendeDaten ("go"+chr(10)) 'NT mit anschliessendem <LF>
'Print TIME & " Insgesamt bisher " & BytesGesendet & " Bytes gesendet."
'Sleep 200
Close #1
'Print "COM-Port geschlossen"
End If
end sub
sub on_stop_clicked cdecl alias "on_stop_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_stop_clicked
'******************************************************************************
Farbe.red = 255 * 257
Farbe.green = 10 * 257
Farbe.blue = 0 * 257
gtk_widget_modify_bg (eventbox01, GTK_STATE_NORMAL, @Farbe)
gtk_label_set_text(label01, "stopped")
Zeitausgabe
outbuff = outbuff + Zeit + " button pressed [stop]" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
scrollen
If (Open Com ( COMPort For Binary As #1 ) <> 0 ) Then
'Print "Fehler: Der Port konnte nicht geoeffnet werden!"
Else
'Print "COM-Port geoeffnet"
'Sleep 100
SendeDaten ("stop"+chr(10)) 'NT mit anschliessendem <LF>
'Print TIME & " Insgesamt bisher " & BytesGesendet & " Bytes gesendet."
'Sleep 200
Close #1
'Print "COM-Port geschlossen"
End If
end sub
sub on_imagemenuitem_Beenden_activate cdecl alias "on_imagemenuitem_Beenden_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Beenden_activate
'******************************************************************************
Beenden
end sub
sub on_imagemenuitem_Einstellungen_activate cdecl alias "on_imagemenuitem_Einstellungen_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Einstellungen_activate
'******************************************************************************
Fehler
gtk_widget_show_all( Einstellungen)
end sub
sub on_imagemenuitem_Verbinden_activate cdecl alias "on_imagemenuitem_Verbinden_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Verbinden_activate
'******************************************************************************
Fehler
gtk_widget_show_all( Einstellungen)
end sub
sub on_imagemenuitem_Trennen_activate cdecl alias "on_imagemenuitem_Trennen_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Trennen_activate
'******************************************************************************
Fehler
gtk_widget_show_all( Einstellungen)
end sub
sub on_imagemenuitem_Info_activate cdecl alias "on_imagemenuitem_Info_activate" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_imagemenuitem_Info_activate
'******************************************************************************
gtk_widget_show_all( Info)
end sub
sub on_Info_delete_event cdecl alias "on_Info_delete_event" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_Info_delete_event
'******************************************************************************
gtk_widget_hide_on_delete( Info)
end sub
sub on_button1_clicked cdecl alias "on_button1_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_button1_clicked
'******************************************************************************
gtk_widget_hide( Info)
end sub
sub on_Einstellungen_delete_event cdecl alias "on_Einstellungen_delete_event" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_Einstellungen_delete_event
'******************************************************************************
gtk_widget_hide_on_delete( Einstellungen)
end sub
sub on_button2_clicked cdecl alias "on_button2_clicked" (byval object as GtkObject ptr, byval user_data as gpointer) export
'******************************************************************************
'* put your code below for signal on_button2_clicked
'******************************************************************************
gtk_widget_hide( Einstellungen)
end sub
'******************************************************************************
'* put your code below for own subroutines
'******************************************************************************
sub SendeDaten (ByVal Daten As String)
Dim i As Integer
Dim Z As String
For i = 1 To Len(Daten) 'Daten zeichenweise ueber Port senden
Z = Mid(Daten,i,1)
Put #1,,Z
'Sleep 10 'ggf. kurze Pause? Vermutlich nicht noetig. Abhaengig von Gegenstelle.
Next
BytesGesendet += Len(Daten)
end Sub
sub Fehler
FehlerAnz = FehlerAnz+1 'Fehleranzahl um 1 erhöhen
gtk_label_set_text(label05, "" &FehlerAnz) 'aktuelle Fehleranzahl in GUI/label05 ausgeben
Zeitausgabe
outbuff = outbuff + Zeit + " Fehler (" &FehlerAnz & ")" + chr(13) + chr(10)
gtk_text_buffer_set_text (widgetbuff, outbuff, -1)
gtk_widget_modify_font (textview1, widgetbuff)
scrollen
end sub
sub Zeitausgabe
Zeit = Time
end sub
sub Beenden
messagedialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Wollen sie wirklich beenden?")
Farbe.red = 206 * 257
Farbe.green = 222 * 257
Farbe.blue = 254 * 257
gtk_widget_modify_bg (messagedialog, GTK_STATE_NORMAL, @Farbe)
parent = GTK_WINDOW (robot_control_1_0)
gtk_window_set_transient_for (GTK_WINDOW(messagedialog), parent)
answer = gtk_dialog_run (GTK_DIALOG (messagedialog))
gtk_widget_destroy (messagedialog)
if answer = GTK_RESPONSE_YES then
' g_source_remove(timeout1id) 'nur wenn timeout verwendet zur kontinuierlichen Systemzeitermittlung und Ausgabe
gtk_main_quit () 'quits the GUI processing / beendet die GUI-Verarbeitung
else
gtk_widget_show_all( robot_control_1_0 ) 'show the destroyed window again
end if
end sub
sub scrollen
gdk_threads_enter ()
mark = gtk_text_buffer_get_insert (widgetbuff)
gtk_text_buffer_get_iter_at_mark(widgetbuff, iter, mark)
gtk_text_buffer_insert(widgetbuff, iter, outbuff, -1)
gtk_text_view_scroll_mark_onscreen(gtk_TEXT_VIEW(textview1), mark)
gdk_threads_leave ()
end sub
Function timeout_callback_zeit CDECL (BYVAL user_data AS gpointer) AS gpointer 'AS gboolean '(bei Verwendung von timeout)
Do
For i1 = 1 To 900
Sleep 1
Next i1
Zeitausgabe
gdk_threads_enter ()
gtk_label_set_text(label06, "" &Zeit)
gdk_threads_leave ()
Loop
return TRUE
end Function
Function robot_direction CDECL (BYVAL user_data AS gpointer) AS gpointer
Do
For i22 = 1 To 36000
For i2 = 1 To 10
sleep 1
Next i2
direction2 = Format (direction, "000.00")
direction = direction + 0.01
gdk_threads_enter ()
gtk_label_set_text(label03, "" &direction2)
gdk_threads_leave ()
Next i22
For i22 = 1 To 36000
For i2 = 1 To 10
sleep 1
Next i2
direction2 = Format (direction, "000.00")
direction = direction - 0.01
gdk_threads_enter ()
gtk_label_set_text(label03, "" &direction2)
gdk_threads_leave ()
Next i22
Loop
return TRUE
end Function
Function robot_voltage CDECL (BYVAL user_data AS gpointer) AS gpointer
Do
For i33 = 1 To 2400
For i3 = 1 To 75
sleep 1
Next i3
voltage3 = Format (voltage, "00.00")
voltage = voltage + 0.01
gdk_threads_enter ()
gtk_label_set_text(label10, "" &voltage3)
gdk_threads_leave ()
Next i33
For i33 = 1 To 2400
For i3 = 1 To 75
sleep 1
Next i3
voltage3 = Format (voltage, "00.00")
voltage = voltage - 0.01
gdk_threads_enter ()
gtk_label_set_text(label10, "" &voltage3)
gdk_threads_leave ()
Next i33
Loop
return TRUE
end Function
Function robot_distance CDECL (BYVAL user_data AS gpointer) AS gpointer
Do
For i44 = 5 To 15000
For i4 = 1 To 130
sleep 1
Next i4
distance4 = Format (distance, "00.000")
distance = distance + 0.001
gdk_threads_enter ()
gtk_label_set_text(label08, "" &distance4)
gdk_threads_leave ()
Next i44
For i44 = 5 To 15000
For i4 = 1 To 130
sleep 1
Next i4
distance4 = Format (distance, "00.000")
distance = distance - 0.001
gdk_threads_enter ()
gtk_label_set_text(label08, "" &distance4)
gdk_threads_leave ()
Next i44
Loop
return TRUE
end Function
|
Grüße wwt. |
|
Nach oben |
|
|
worldwidetrekking
Anmeldungsdatum: 22.08.2009 Beiträge: 38
|
Verfasst am: 18.03.2011, 10:09 Titel: |
|
|
Beim Testen ist mir eine Sache aufgefallen:
Wenn ich ein Fenster verschieben möchte und dazu die Kopfleiste mit der Maus anklicke (Maustaste gedrückt halte) stoppen alle Threads. Sie laufen erst weiter, wenn ich die Maustaste wieder los lasse.
Wenn ich aber irgend einen Button drücke und diesen gedrückt halte entsteht dieser Effekt nicht. In diesem Fall laufen alle Threads weiter.
Weiß jemand, ob man dieses Problem irgendwie lösen kann?
grüße wwt. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|