Datenaustausch mit Thread



  • Hallo,

    meine Anwendung besteht aus Performance Gründen aus einem Hauptprogramm und mehreren Arbeits-Threads in denen die Funktion der Anwendung "erledigt" wird.

    Nun möchte ich dem Anwender den aktuellen Stand der "Arbeit" mitteilen, wie kann man diesen Datenaustausch bewerkstelligen? Ist es erlaubt eine gemeinsame (globale) Struktur zu definieren in die der Thread schreibt und das Hauptprogramm ließt?
    Wie mache ich soetwas sehr effizient - damit nicht unnötig Rechenzeit verschwendet wird?

    Grüße
    Anton



  • Hallo

    Die Kommunikation zwischen Threads (auch die GUI läuft ja in einem Thread) ist keine Frage der Geschwindigkeit, da kannst du jede Möglichkeit nutzen die dir OOP bringt, eine globale Struktur ist eigntlich nicht notwendig. Wichtig ist vielmehr das die Kommunikation synchronisiert wird. Dafür gibts TThread::Synchronize. Weiteres findest du hier im Tutorial.

    bis bald
    akari



  • Danke für die Info, den Artikel kannte ich zwar schon, habe aber noch einige Fragen:

    - muss ich Daten die nichts mit der VCL zu tun haben auch mittels einer Syncronisation austauschen?

    - wieviel Zeit nimmt ein solcher Austausch in anspruch?

    - was passiert wenn der Haupt-Thread gerade einen kurzen Sleep ausführt?

    Vielleicht gibt es einige Schlaue die sich damit auskennen.

    Danke
    Anton



  • Hallo

    1. Ja, alle Daten müßen synchronisiert werden, egal ob VCL oder nicht
    2. Ist nicht festlegbar, denn ein Thread muß warten bis der andere bereit ist zur Übernahme. Auch das Betrisbssystem hat da einen Einfluß drauf. Normalerweise sollte die reine Synchronisation in vernachlässigbarer Zeit erfolgen, der Hauptteil dürfte eher das aktualisieren von GUI-Controls sein. Und da die Synchronisation sowieso unverzichtbar ist, solltest du dir da keine gedanken machen.
    3. Die Synchronisation garantiert dir die Verarbeitung, notfalls wartet der andere Thread eben. sleep sollte man sowieso nicht verwenden.

    bis bald
    akari



  • zu 3. hab ich noch eine Frage:

    Wenn ein Thread auf die Daten (oder das Ende) von anderen Threads wartet hab ich bisher eine Kombination aus

    while (warten)
    {
      Sleep(xx);
      Application->ProcessMessages();
    }
    

    verwendet.

    Wie macht man das besser?



  • Hallo

    Mit Synchronize. Da ist das "Warten" schon mit drin, und zwar wesentlich leistungsschonender als deine Variante. Wenn du wirklich das Tutorial schon kennst, sollte das dir doch klar sein.

    bis bald
    akari



  • Hallo,

    akari schrieb:

    1. Ja, alle Daten müßen synchronisiert werden, egal ob VCL oder nicht

    ich seh das doch etwas anderes:
    Wenn du in einem Thread Daten bearbeitest, von den du weißt, sie braucht zur gleichen Zeit kein anderer Thread, dann kannst du unbesorgt mit voller Geschwindigkeit darauf zugreifen - ohne zu syschronisieren. Du must dir nur sicher sein und bei VCL-Daten kann man das halt nicht sein.

    Gruß Rudi


Anmelden zum Antworten