AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Events in anderem Thread auslösen

Ein Thema von OregonGhost · begonnen am 29. Nov 2006
Antwort Antwort
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#1

Events in anderem Thread auslösen

  Alt 29. Nov 2006, 12:52
Und schon bin ich beim nächsten Multithreading-Problem.
Stark vereinfacht hat meine Anwendung zwei Threads. Den Hauptthread, dem die GUI gehört und der diese u.U. recht häufig aktualisiert, und einen Ladethread, der im Hintergrund Daten lädt. Die GUI zeigt die Daten auf dem letzten Stand an. Wenn jetzt also mehr Daten geladen sind, muss die GUI das irgendwo her wissen, denn vom Prinzip her ist sie Event-basiert, so dass ich ein Polling eher für unglücklich halte. Also haben die Klassen, die die Daten laden, ein Event, in das sich die GUI einträgt. Wenn ich das Event jetzt aber vom Ladethread aus auslöse, wird es im selben Thread abgearbeitet, nicht im GUI-Thread. Es scheint Myriaden Möglichkeiten zu geben, das zu erreichen, aber welche soll ich denn nehmen?
Nur um nichts falsch zu verstehen, es handelt sich um einen Hintergrund-Thread. Die GUI nimmt zwar immer die neuesten Daten, die der Thread geladen hat, aber sie wartet nicht explizit darauf, sondern man arbeitet ganz normal weiter. Ist also keine Fortschritts-Balken-Geschichte.

Am tollsten wäre es, wenn es eine Möglichkeit gäbe, dem Event zu sagen, dass es im GUI-Thread ausgeführt werden soll. Das scheint aber nicht zu gehen. Eine Möglichkeit, die ich gefunden habe, sieht stilisiert ungefähr so aus:
Code:
void ShowProgress(object param)
{
  if(!InvokeRequired) {
    // Update GUI
  } else {
    ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
    Invoke(showProgress, param);
  }
}
Nun wird es voraussichtlich bei mir nur ein oder zwei solche Events geben, so dass sich der Aufwand in Grenzen hält. Erinnert mich aber immer etwas an die unschöne fork()-Geschichte unter Unix. Der Vorteil ist halt, dass ich das Event einfach auslösen kann, wo ich will, und es sorgt selbst dafür, im richtigen Thread zu landen (es soll hier mal nicht stören, dass das Beispiel weniger für ein Event als für einen Delegaten gedacht war). Der Ladethread kann Control.Invoke() natürlich von sich aus nicht aufrufen, da er von der GUI nichts weiß, so dass das flachfallen würde. Ist diese Methode also vernünftig?

Oh, dann gäbe es noch als Alternative den BackgroundWorker. Hier habe ich mich noch nicht ganz so weit eingearbeitet. Dort gibt es einerseits ein Event, das die eigentliche Arbeit in einem separaten Thread ausführt, und umgekehrt können von diesem Thread aus dann einige Events im Original-Thread aufgerufen werden (zumindest scheint es so), die eine Fortschrittsanzeige ermöglichen oder das Ende des Threads ankündigen. Passt jetzt nicht hundertprozentig zu meinem Problem, denn ich brauche Benachrichtigungen, wenn neue Daten vorliegen, während der eigentliche Fortschritt mich überhaupt nicht interessiert. Wenn ich also dafür ein Event missbrauche, dem man eigentlich eine Prozentzahl mitgeben soll, hat das irgendwie etwas verruchtes, aber vielleicht bin ich da kleinlich

Also, was sagt jemand, der sich damit auskennt? Die "fork"-Geschichte? Oder einfach mit dem BackgroundWorker arbeiten? Oder was ganz anderes?
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz