GTK+ Dauerschleife



  • Super Code Danke! Damit kann ich das denke ich lösen. 🙂 👍

    UPDATE: -andere Fragen geklärt und gelöscht-

    ----------

    UPDATE: -Diese Frage ist noch offen-:

    Noch was anderes, ich muss ja die Funktion die mit dem Sensoren zusammenarbeitet und mir die Daten in die Structs schiebt einmalig am Anfang aufrufen.

    Wenn ich es richtig verstanden habe muss ich dazu einen Thread erstellen.

    Wie funktioniert das genau, mal angenommen ich möchte die Funktion "readData" einmalig starten. Soviel wie ich bisher rausgefunden habe geht das in etwa so:

    void readData(WorkFields *work){
    //aus Schnittstelle Daten empfangen und ins Struct schreiben
    }
    
    int main(){
    
    const gchar     *title = "Temperatur";
    WorkFields      *work;  
    work = g_slice_new(WorkFields);
    
    pthread_t thread1;
    g_thread_init (NULL);
    gdk_threads_init ();
    gdk_threads_enter ();
    
    //blabla das restliche Programm
    
    pthread_create (&thread1, NULL, readData, work);
    
    g_timeout_add(1000, (GSourceFunc) time_handler, work); 
    gtk_widget_show_all(work->window1);
    time_handler(work);
    
    tk_main ();
    gdk_threads_leave ();
    
    return 0;
    }
    

    Wenn es Fehler gibt, gerne verbessern. Ich habe das jetzt mal für dein Programm geschrieben. Sprich die Reihenfolge der Befehle hätte ich wie im Code gemacht.



  • Schade wenn abcdefg hier nicht mehr reinschauen sollte. Gibt es jemanden anderen der das weis? Ist ja doch eher eine allgemeine Frage, das Thema Threads. 🙂

    Gruß



  • JohnDillinger schrieb:

    Schade wenn abcdefg hier nicht mehr reinschauen sollte. Gibt es jemanden anderen der das weis? Ist ja doch eher eine allgemeine Frage, das Thema Threads. 🙂

    Gruß

    JohnDillinger schrieb:

    UPDATE: -andere Fragen geklärt und gelöscht-

    Nach wie vor denke ich, dass Du nicht mit Threads in Zusammenhang Deiner Temperaturabfrage arbeiten musst. Die Abfrage eines Sensors - sei es Temperatur, Helligkeit, Wasserstand oder was auch immer, gehört eigentlich zu den trivialsten Aufgaben.

    abcdef schrieb:

    Was ich jetzt nicht wirklich verstehe, ist Dein Programmablauf:

    1. Du bekommst von irgendwoher Daten
    2. Diese Daten möchtest Du ständig aktualisiert anzeigen.

    Wie ist da die konkrete Konstellation? Ein Programm? - Schnittstelle? - Mehrere Programme?

    Wieso kannst Du in dieser Timerschleife nicht einen Port abfragen, der Dir die aktuellen Temperaturen liefert?



  • abcdefg schrieb:

    JohnDillinger schrieb:

    Schade wenn abcdefg hier nicht mehr reinschauen sollte. Gibt es jemanden anderen der das weis? Ist ja doch eher eine allgemeine Frage, das Thema Threads. 🙂

    Gruß

    JohnDillinger schrieb:

    UPDATE: -andere Fragen geklärt und gelöscht-

    Nach wie vor denke ich, dass Du nicht mit Threads in Zusammenhang Deiner Temperaturabfrage arbeiten musst. Die Abfrage eines Sensors - sei es Temperatur, Helligkeit, Wasserstand oder was auch immer, gehört eigentlich zu den trivialsten Aufgaben.

    abcdef schrieb:

    Was ich jetzt nicht wirklich verstehe, ist Dein Programmablauf:

    1. Du bekommst von irgendwoher Daten
    2. Diese Daten möchtest Du ständig aktualisiert anzeigen.

    Wie ist da die konkrete Konstellation? Ein Programm? - Schnittstelle? - Mehrere Programme?

    Wieso kannst Du in dieser Timerschleife nicht einen Port abfragen, der Dir die aktuellen Temperaturen liefert?

    Weil ich die Funktionen der Schnittstelle brauche.

    Zum einem kann ich mit Ihnen mit der Hardware kommunizieren (Sensorwerte einlesen) und zum anderen bieten Sie mir weitere Optionen wie Filterungen.
    Mal angenommen ich frage einen Sensor (nicht nur Temp.sensoren) alle 100ms ab. Es dauert aber einmal 500ms bis ein neuer Wert kam. Dann kann ich das als Meldung ausgeben und so weiter...
    Es ist ein wenig umfangreicher und komplizierter. Ich versuche es nur so einfach wie möglich zu beschreiben damit es, unter anderem auch für passive Mitleser, einfacher zu verstehen ist.

    Ich muss das also einmalig anstoßen und dann rennt das Ding und schiebt mir meine gewünschten Werte in die Structs, mit denen ich dann parallel in einer anderen Funktion weiterarbeite (veraendern, ausgeben...).

    Ich dachte dafür braucht man Threads. Liege ich da richtig?
    Wenn ja, ist mein Code denn so in etwa korrekt?

    Gruß



  • JohnDillinger schrieb:

    Ich muss das also einmalig anstoßen und dann rennt das Ding und schiebt mir meine gewünschten Werte in die Structs, mit denen ich dann parallel in einer anderen Funktion weiterarbeite (veraendern, ausgeben...).

    Wo sind diese Structs denn angesiedelt? - Wenn diese Structs in einem eigenen Prozess sind, wirst Du darauf von einem anderen Prozess nicht zugreifen können, der seperat gestartet wird (GTK+ Programm)

    JohnDillinger schrieb:

    Ich dachte dafür braucht man Threads. Liege ich da richtig?
    Wenn ja, ist mein Code denn so in etwa korrekt?

    Ich weiss nicht, ob Du diesen Link schon gefunden hast - aber hier mal eine deutsche Seite, die das Konzept von Threadprogrammierung auf einfache Art erläutert (ist zwar recht alt, aber geändert hat sich am Konzept nichts):
    http://www.ijon.de/comp/tutorials/threads/index.html

    Dieses "shared Memory" bezieht sich eigentlich nur auf eine "Unit of Compile/Link" - sprich: Es gibt ein Hauptprogramm, das diese Threads "managed", also verwaltet - auch Dein Portabfrageprogramm müsste in dieser "Unit of Compile/Link" dort eingebunden werden.
    Wenn jemand mitliest, der es besser weiss - please fix me... 😉



  • Jap hatte ich schon angeschaut.

    Hier sagt er aber, das die Threads schon auf den selben Speicherbereich zugreifen können um sich auszutauschen. Ist deine Aussage nicht das Gegenteil davon oder habe ich es falsch verstanden?

    Die Structs liegen wie in deinem Beispiel in den WorkFields. Sprich ich mache alles (labels, table, window, structs...) über einen Pointer *work und reserviere Speicherplatz dafür. Dann kann ich von überall darauf zugreifen.
    Geht das nicht Threadübergreifend wenn ich dem Thread, den Pointer *work übergebe?

    Dann gibt es ja noch das Thema Mutexe, um zu verhindern das 2 Threads gleichzeitig z.B. eine Variable verändern wollen und es zu undefinierten Zuständen kommt.
    Bei mir soll der "2. Thread" die Werte in das Struct schieben und der andere Programmteil (time_handler) entnimmt diese Werte nur, z.B. kopiert sie in eigene lokale Variablen und verarbeitet nur diese Variablen (umrechnen, ausgeben).
    --> Dann kann ich mir das mit den Mutexen doch auch sparen, da ich nur von "einer Seite" schreibe und von der "anderen Seite" nur lese, stimmt das?


Anmelden zum Antworten