Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

gtk_main() und endlosschleife aus eigenem code

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 16.02.2011, 17:05    Titel: gtk_main() und endlosschleife aus eigenem code Antworten mit Zitat

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:
Code:
Zeit = Time

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... weinen
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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 16.02.2011, 18:12    Titel: Lösung Antworten mit Zitat

Hallo,

ich hab wieder Erwarten doch selbst die Lösung gefunden.
Lag an einem echt dummen Fehler von mir selbst. mit dem Kopf durch die Mauer wollen

Wie peinlich - ich mags eigentlich gar nicht posten... verlegen

Ich hab die Codezeile
Code:
    timeout1id=g_timeout_add(100,@timeout_callback,NULL)

erst nach
Code:
    gtk_main( )

geschrieben.
Als mir das eben aufgefallen ist hab ich die beiden Zeilen einfach getauscht und siehe da es funktinoniert - wunderbar happy

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 16.02.2011, 20:57    Titel: Antworten mit Zitat

Zu letzterem: Scoping für Namen bitte beachten, siehe Befehlsreferenz zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 17.02.2011, 08:36    Titel: Antworten mit Zitat

@28398: Vielen Dank für den Hinweis!
Hab es eben schnell geändert und siehe da es gibt keine Fehlermeldung mehr beim kompilieren happy
Ich hab in der Zwischenzeit auch verstanden, wozu der Befehl dient... grinsen
Wobei bei mir auch keine Fehler aufgetreten sind wenn ich es auskommentiert hatte.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 25.02.2011, 12:21    Titel: Lösung gefunden Antworten mit Zitat

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. mit dem Kopf durch die Mauer wollen
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... verlegen
Jetzt funktioniert es! grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 08.03.2011, 17:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.03.2011, 17:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 08.03.2011, 17:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.03.2011, 19:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 08.03.2011, 22:23    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 09.03.2011, 21:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 10.03.2011, 00:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 10.03.2011, 09:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 11.03.2011, 22:21    Titel: Antworten mit Zitat

Ich hab das ganze jetzt noch mal versucht und habe festgestellt, dass trotz Anpassung der gthread.bi die Sache mit dem
Code:
g_thread_create()

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
Code:
loop

verwenden.
Ich hab meine Funktion mal 10-fach hintereinander gesetzt mit
Code:
sleep 900

dazwischen.
Dadurch habe ich sehen können, dass der Thread läuft und dass der Rest der Anwendung wie erwartet unabhängig funktioniert! zwinkern
[edit]

[edit] 22:56
So, ich hab es jetzt.
Mit einer
Code:
Do...
Loop

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 11.03.2011, 23:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 11.03.2011, 23:22    Titel: Antworten mit Zitat

Hey XOR,

danke für deine Antwort.
Ich war da kurzfristig auf dem Holzweg mit meinen Gedanken... verlegen

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. zwinkern

grüße wwt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 13.03.2011, 19:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
worldwidetrekking



Anmeldungsdatum: 22.08.2009
Beiträge: 38

BeitragVerfasst am: 18.03.2011, 09:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz