Threads Grundgedanken



  • Hallo,
    ich habe folgendes vor. Einen Thread für die GUI vermutlich mit Qt. Und einen anderen, in dem Variablen geändert werden. Dieser Thread soll aus einer Endlosschleife bestehen.
    Qt arbeitet ja mit dem Slotkonzept. Außerdem bietet es eine Thread Klasse an. Aber wie gestalte ich da vom Grundaufbau her folgendes Konzept:

    Eingabe(GUI)->Thread(Endlosschleife)->Ausgabe(GUI).

    Es wäre nett, wenn mir jemand helfen könnte. Danke!



  • vielleicht solltest du nicht planen in welcher weise du threads verwenden willst, ohne zu wissen, wie man mit threads arbeitet 😕



  • Also, bei den meisten GUI-Frameworks läuft das ja so, dass es erstmal nur einen Thread gibt, der den "Event-Loop" des GUI-Frameworks ausführt. Ungefähr so:

    int main() {
      GuiFrameWork::App myaplication;
      // initialisieren, fenster bauen, layout, etc
      // ...
      GuiFrameWork::run(myapplicaction); // Event-Loop starten
    }
    

    Event-Loop (so ungefähr):

    // eigene Nachrichten-Handler beim Betriebssystem
    // registrieren, welche die Event-Queue füllen
    for (;;) {
      unique_ptr<Event> evptr;
      {
        Lock lck (eventqueue_mutex);
        while (eventqueue.empty()) {
          not_empty_condition.wait(lck);
        }
        evptr = eventqueue.pop_event();
      } // <-- Mutex wird wieder freigegeben
      if (is_quit_event(*evptr)) break;
      // Einen Verantworlichen für das Event suchen und den
      // entsprechenden Handler aufrufen
    }
    // eigene Nachrichten-Handler beim Betriebssystem
    // entfernen
    // weitere Aufräumarbeiten...
    

    Du brauchst im Prinzip nur einen neuen Thread, wenn Du nebenläufig etwas berechnen willst, wobei die GUI in der Zeit noch reagieren soll. Die Kommunikation mit dem GUI-Thread könnte zB so laufen, dass der Berechnungsthread eigene Events in die Queue schiebt, welche dann in dem anderen Thread abgearbeitet werden. Der "Berechnungsthread" könnte auch eine Nachrichten-Queue haben, so dass man ihn von der GUI aus steuern kann...

    Ich bin sonst nicht so fit, was GUI Programmierung angeht (ich drücke mich gern darum). Aber es würde mich wundern, wenn ein gutes GUI-Framework neine Thread-sicheren Nachrichtenschlangen anbieten würde...



  • Also Threads habe ich schon in Konsolenanwendungen verwendet. Nur GUI ist eben neu für mich. Also ich muss später noch einige komplizierte Berechnungen machen, also sollten die schon einen extra Thread einnehmen. Kleinere Sachen würde ich direkt in der Eventloop machen. Weiß einer, wie das bei Qt geht?

    Und das mit der Thread sicheren Quee hört sich gut an. Also wenn das Qt hätte wäre es ja toll. Heißt das ich muss mich dann nicht um die critical Section kümmern?



  • Der Qt GUI Kram _DARF_ nicht in einen Thread ausgelagert werden. Sämtlicher GUI Kram muss im Main-Thread bleiben.

    Ansonsten bietet Qt dir eine Thread-Klasse an um _deine_ Rechnungen auszulagern. Du darfst keinerlei GUI Zugriff aus einem fremden Thread ausführen. Welche QContainer Threadsafe sind und welche nicht, steht in der Doku zu den jeweiligen Klasse. Die Qt Doku ist sehr sehr gut, einfach mal durchschnuppern. 😉


Anmelden zum Antworten