Hallo Profis,
ich erzeuge innerhalb des Hauptfensters (setAppWindow()) versteckt verschiedene Dialogfenster. Diese übergeben ich je nach Bedarf einem Thread in dem sie angezeigt werden. Dieser Thread enthält eine eigene Eventschleife. Wenn ich nun mit postAppEvent eine Nachricht an die Eventschleife des Unterfenster senden möchte, gebe ich das Unterfenster als letzten Parameter im Aufruf an. Aus irgendeinem Grund gelangen diese Nachrichten stets in die Eventschleife des Hauptfensters. Woran kann dies liegen? Weitergehend, wodurch wird die Zuordnung des Unterfensters zur Eventschleife im Thread geschaffen?
Danke für Ideen.
Verschiedene Dialogfenster in einem Thread ausführen
Moderator: Moderatoren
- Klaus Schuster
- Foren-Administrator
- Beiträge: 367
- Registriert: Do, 24. Jan 2008 10:01
- Wohnort: 90762 Fürth
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 9 Mal
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2825
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 96 Mal
- Danksagung erhalten: 13 Mal
Re: Verschiedene Dialogfenster in einem Thread ausführen
Hallo, Klaus -
wenn Du im PostAppEvent() für oXbp ein Objekt angibst, das zu dem betreffenden Thread gehört (d.h. in dem Thread erzeugt worden ist), dann sollte die Nachricht auch dort ankommen.
Ich verwende so etwas um einen Browse zu aktualisieren, wenn in einem Dialog, der in einem eigenständigen Thread läuft, eine Änderung an einem Datensatz vorgenommen wurde. Zu diesem Zweck erhält der Dialog eine Referenz auf das XbpBrowse-Objekt. Das ist zwar das Spiegelbild zu Deinem Scenario, funktioniert aber.
Ich würde Dir raten, nochmals zu prüfen, ob Du das richtige Objekt angibst, denn in der Haupt-Eventschleife muss ja ein solches Objekt irgendwie "bekannt" sein.
wenn Du im PostAppEvent() für oXbp ein Objekt angibst, das zu dem betreffenden Thread gehört (d.h. in dem Thread erzeugt worden ist), dann sollte die Nachricht auch dort ankommen.
Ich verwende so etwas um einen Browse zu aktualisieren, wenn in einem Dialog, der in einem eigenständigen Thread läuft, eine Änderung an einem Datensatz vorgenommen wurde. Zu diesem Zweck erhält der Dialog eine Referenz auf das XbpBrowse-Objekt. Das ist zwar das Spiegelbild zu Deinem Scenario, funktioniert aber.
Ich würde Dir raten, nochmals zu prüfen, ob Du das richtige Objekt angibst, denn in der Haupt-Eventschleife muss ja ein solches Objekt irgendwie "bekannt" sein.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Klaus Schuster
- Foren-Administrator
- Beiträge: 367
- Registriert: Do, 24. Jan 2008 10:01
- Wohnort: 90762 Fürth
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 9 Mal
Re: Verschiedene Dialogfenster in einem Thread ausführen
Hallo Georg,
vermutlich hast Du mit "(d.h. in dem Thread erzeugt worden ist)" den Kern getroffen. Die Dialogfenster werden nicht im Thread erzeugt, sondern vorher im Hauptfenster. Ich wollte :create() um Resourcen zu schonen nur einmal beim Programmstart ausführen. Während eines Vortrags hat Steffen ein ähnliches Vorgehen angesprochen, den Aspekt, die Fenster anschließend in einem Thread auszuführen, jedoch nicht erwähnt. Vielleicht besteht ein Lösungsansatz darin, das gesamt Threadobjekt inklusive Maske zu erzeugen und mit :start auszuführen.
Weißt Du einen anderen Weg, die Fenster an den Eventloop im Thread zu koppeln?
vermutlich hast Du mit "(d.h. in dem Thread erzeugt worden ist)" den Kern getroffen. Die Dialogfenster werden nicht im Thread erzeugt, sondern vorher im Hauptfenster. Ich wollte :create() um Resourcen zu schonen nur einmal beim Programmstart ausführen. Während eines Vortrags hat Steffen ein ähnliches Vorgehen angesprochen, den Aspekt, die Fenster anschließend in einem Thread auszuführen, jedoch nicht erwähnt. Vielleicht besteht ein Lösungsansatz darin, das gesamt Threadobjekt inklusive Maske zu erzeugen und mit :start auszuführen.
Weißt Du einen anderen Weg, die Fenster an den Eventloop im Thread zu koppeln?
Gruß Klaus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2825
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 96 Mal
- Danksagung erhalten: 13 Mal
Re: Verschiedene Dialogfenster in einem Thread ausführen
Hallo, Klaus -
in der Quelle des Haupt-Eventloop:
Auf diese Art und Weise solltest Du aus einem Thread durch Aufruf von AddAThread() entweder das Thread-Objekt (von dem ich nicht weiss, ob es als zum Thread gehörend betrachtet wird) oder irgendein anderes Objekt, das im Thread-Kontext erzeugt wurde, sowie eine Identifikation zurückgeben. Die legst Du in aThreads ab. cInfo dient dazu, es Deinem Programm zu ermöglichen, den "richtigen" Thread zu erkennen.
Ansonsten starte ich den Thread und erzeuge alle dazu gehörenden Dialoge als ersten Schritt im neuen Thread.
in der Quelle des Haupt-Eventloop:
Code: Alles auswählen
Static aThreads
FUNCTION Main()
...
aThreads := {}
...
nEvent := xbe_None
WHILE nEvent <> xbeP_Close
...
END
RETURN(.T.)
FUNCTION AddAThread(oThread, cInfo)
AAdd(aThreads, {oThread, cInfo})
RETURN(.T.)
Ansonsten starte ich den Thread und erzeuge alle dazu gehörenden Dialoge als ersten Schritt im neuen Thread.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Klaus Schuster
- Foren-Administrator
- Beiträge: 367
- Registriert: Do, 24. Jan 2008 10:01
- Wohnort: 90762 Fürth
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 9 Mal
Re: Verschiedene Dialogfenster in einem Thread ausführen
Hallo Georg,
herzlichen Dank für Deine Anregungen! Ich werde, sobald es mir möglich ist, Tests ausführen und berichten.
herzlichen Dank für Deine Anregungen! Ich werde, sobald es mir möglich ist, Tests ausführen und berichten.
Gruß Klaus