wxWidgets: Multithreading empfehlenswert ?



  • Hi Leuts,
    ich habe hier eine Software die kontinuierlich Messwerte die über die RS232 reinkommen anzeigt. Dies geschieht in einem Intervall von 1 s.
    Nun ist verständlicherweise so, dass die Anwendung recht träger auf Usereingaben reagiert, solange die Messwerte empfangen und verarbeitet werden.
    Ist es empfehlenswert hier Multithreading einzusetzen, und die Werte in einem eigenen Thread zu lesen ?
    Die Anwendung ist so aufgebaut, dass der User ein bestimmtes Intervall (x > 1s) einstellen kann, und ein entsprechender Timer gesetzt wird. In der Funktion des Timerevents lese ich dann die Daten. Hier müßte ich einen eigenen Thread aktivieren, oder ?



  • Musst Du nicht... wenn das ganze unterbrechungsfrei laufen soll wäre es vllt gut oder?
    rya.



  • Sorry, verstehe ich nicht, deine Antwort.
    Wenn das Ganze unterbrechungsfrei laufen ?????



  • les nochmal 😛
    Naja gibt es eine Unterbrechung oder einen Hänger wenn Du die Daten liest?
    Nein -> brauchst keinen Thread
    Ja -> neuen Thread der nebenher läuft.. funzt aber nur auf Multicores richtig da nur diese auch gleichzeitig auf 2 Threads arbeiten können... und selbst dann ist nicht gewährleistet dass dein 2ter Thread auf Core 2 läuft afaik.
    Vllt kann ja jmd anders noch was dazu sagen.
    Mein Wissen um dieses Thema ist begrenzt.
    rya.



  • Sobald ich die serielle Schnittstelle öffne, lese ich im 1 Sekunden Takte Werte. Und Sobald diese Funktion aktiv ist, reagiert die Oberfläche recht träge. Wenn ich also einen Button drücke oder einen Menüpunkt aufrufe, dann dauert es relativ (2-3 Sekunden) lange bis etwas passiert.
    Wenn ich die Anwendung währenddessen schliesse (rotes Kreuz rechts oben) dann passiert gar nichts. Erst wenn danach die Verbindung manuell (also über das Menü) auftrenne, schliesst sich die Anwendung.
    Es hängt sich also nicht´s auf, sondern der kleine Intel-Professor hat halt zu tun.



  • Wenn du keine große Schleife hast, kannst du ab und zu die Gui updaten, d.h. du gibst ein Teil der Rechenzeit ab, die du in der Verarbeitungsroutine hast.

    Wenn du eine große Schleife hast, dann halt

    for (int i = 0; i < bytes_to_read; ++i )
    {
     read_byte();
     if ( i % 100 == 0 )
       wxApp::Yield
    }
    


  • das hört sich gut an, geht aber nicht so. Aus folgenden Gründne:
    1. Ein Aufruf von Yield ohne klammer geht nicht 🙂
    2. Bei wxApp::Yield() meckert er:
    wxApp::Yield': Unzulässiger Aufruf einer nicht statischen Memberfunktion

    3. Das eigentliche Problem: Pro Sekunden werden zwei Messwerte nacheinander geholt. Hier könnte man Yield() zwischen Aufruden einbauen. Wenn ich sie denn hätte 🙂 Der Aufruf basiert auf einer gekauften DLL, wo ich nur "ReadData()" aufrufe. Also ZWISCHEN den einzelnen Abrufen kann ich kaum was tun 😞

    Anyway, ich denke ich versuche es mal mit Multithreading. Auch wenn es nichts hilft, vielleicht lerne ich was dabei



  • Thule schrieb:

    das hört sich gut an, geht aber nicht so. Aus folgenden Gründne:
    1. Ein Aufruf von Yield ohne klammer geht nicht 🙂
    2. Bei wxApp::Yield() meckert er:
    wxApp::Yield': Unzulässiger Aufruf einer nicht statischen Memberfunktion

    Benutze wxSafeYield(). Eigentlich eine Idee :), hätte ich drauf kommen müssen.
    Aber machs einfach in einem anderen Thread wenns damit auch nicht geht.
    rya.



  • Hi

    Ich empfehle dir, das mit einem Thread umzusetzen. Bei einem Intervall von 1s kann man das zwar auch direkt machen. Aber, wenn ich das richtig verstanden habe, kann der Benutzer das Intervall einstellen. Wenn dieses dann kleiner wird, kannst du wieder die Probleme bekommen. Daher empfehle ich einen Thread.

    Zudem glaube ich, dass du bei auslesen noch einen Fehler hast, denn jede Sekunden 2 Werte von der seriellen Schnittstelle auszulesen, dürfte den Rechner nicht belasten (auch wenn der älter ist). Ich vermute, dass das noch einiges mehr passiert, so dass dadurch die GUI nicht reagieren kann (evtl auch nur blockierendes Warten).

    @Scorcher24: Multithreading kann auch auf Prozessoren mit nur einem Kern sehr gut ausgeführt werden. Das OS verteilt dabei die Nutzungszeiten des Prozessors. Und dadurch können parallele Abläufe umgesetzt werden. Natürlich ist es effektiver, wenn auch mehrere Kerne verfügbar sind, aber gerade bei der hier beschriebenen Aufgabe ist das nicht notwendig.



  • Scorcher24 schrieb:

    Benutze wxSafeYield(). Eigentlich eine Idee :), hätte ich drauf kommen müssen.

    Ja hättest du! Ich bin enttäuscht 😞

    @Thule
    Die Thread-Philosophie in wxWidgets ist: wxGUI-Calls nur vom Hauptthread aus.
    Wenn man das beachtet, kann nichts schief gehen.


Anmelden zum Antworten