![]() |
Showmodal sperrt zyklisches Event
Hallo !
Ich habe ein Problem mit showmodal und einer Ereignisroutine. Ich habe eine Schnittstelle die Daten liest und immer wenn eine Anforderung gesendet wird, wird nach einer gewissen Zeit ein Ereignis ausgelöst das die Daten Zurückliefert. Die Schnittstelle läuft in im Hauptprozess der Delphi Anwendung. Wenn nun ein Klick auf ein Button im Formular gemacht wird, dann wird ein Fenster mit showmodal geöffnet. Jetzt kommt der Fehler: Wenn die Hauptanwendung gerade in der Ausführung des Ereignis steckt, dann wird das Ereignis solange nicht mehr ausgeführt bis das Modale Fenster geschlossen wird !! Meine Schnittstelle bekommt dann keine Daten mehr !!! Das heißt das wenn in irgend ein Event im Hauptprozess ein Modales Fenster durch buttonclick() aufgerufen wird, das Ereignis sperrt. Das kann doch nicht Sinn eines Modales Fensters sein ?? Gruß Rainer Hat jemand ein Lösungsansatz ? |
AW: Showmodal sperrt zyklisches Event
Hallo Rainer,
so ganz kann ich dem nicht folgen. Grundsätzlich werden Ereignisse (Windows Botschaften) weiterhin empfangen, auch wenn ein modales Fenster geöffnet ist. Natürlich nur solange die Botschaftsverarbeitung der Anwendung auch aktiv ist - heißt "Application.ProcessMessages" wird aufgerufen. Das wird normalerweise von der VCL automatisch erledigt. Kommunikation mache ich üblicherweise in einer eigenen Thread. Diese läuft dann komplett unabhängig vom Vordergrund. Allerdings aktualisiere ich z.B. die Anzeigen im Hauptfenster via Timer oder Thread-Sync Mechanismen. Funktioniert beides gut. Frage: Was passiert in Deinem modalen Dialog? Rufst Du da irgendeine Funktion auf die dann solange ausgeführt wird bis der Dialog beendet ist? Gruß Alex |
AW: Showmodal sperrt zyklisches Event
Hallo BigAll
Windows Botschaften werden ja noch abgeholt. Ich erkläre nochmal kurz meine Schnittstelle. 1. Die Schnittstelle hat 10 Komponenten. 2. Jede Komponente hat ein Timer (Aufruf des Request) 3. Jede Komponente hat ein Event (Auswertung des Response) Wenn der Fehler auftritt, dann werden auch alle anderen 10 Timer Ereignisse, aber nur 9 Response Ereignisse ausgeführt. Ich habe ein internen Logger in der Anwendung integriert. Da sieht man folgendes (ausschnitt aus dem Protokoll) 1. Timer Start Komp 2 2. Senden Komp 2 (Request) 3. Timer Ende Komp 2 4. Event Start Komp 2 (Response). 5. Event Ende Komp 2 (Response). 6. Timer Start Komp 3 7. Senden Komp 3 (Request) 8. Timer Ende Komp 3 9. Event Start Komp 3 (Response). 10. Buttonclick() -> Aufruf Fenster showmodal 11. Timer Start Komp 4 12. Senden Komp 4 (Request) 13. Timer Ende Komp 4 14. Event Start Komp 4 (Response). 15. Event Ende Komp 4 (Response). Protokoll "Event Ende Komp 3" kommt erst wenn das modale Fenster wieder geschlossen wird. Gruss Rainer |
AW: Showmodal sperrt zyklisches Event
Hallo,
aber genau das ist der Sinn von "modal", oder nicht?. Die Nachrichten bekommt das modale Fenster. Lösung1: Threads Lösung2: ? |
AW: Showmodal sperrt zyklisches Event
Was verstehst Du unter "Schnittstelle"? Mit was / wem wird über was kommuniziert?
|
AW: Showmodal sperrt zyklisches Event
Hallo
Also wenn ich eine simple Anwendung mit einem Timer (Event mit 100 ms) habe, der mir die Uhrzeit anzeigt, und ich ein Modales Fenster gerade in der Abarbeitung des Events ausführe und das Fenster offen lasse, meine Ausgabe der Uhrzeit dann stehen bleibt ???? Gruß Rainer |
AW: Showmodal sperrt zyklisches Event
Hallo BigAl
Wenn ich folgendes mache procedure form1.OnTimerEvent(sende:TObject); begin panel1.caption:=datetimetostr(now); form2.showmodal; end; Dann würde ich es verstehen !!! Aber ich rufe das Fenster in OnButtonclick auf. Gruß Rauner |
AW: Showmodal sperrt zyklisches Event
Hallo Rainer,
da läuft irgendetwas anderes schief. Ich vermute mal, dass Du in deinem Dialog (dem modalen Formular) irgendetwas machst, dass die Verarbeitung der Botschaften unterbindet. Wie gesagt: Man muss immer sicherstellen, dass die Nachrichtenverarbeitung auch ausgeführt werden kann. Wenn Du im Dialog etwas machst, dass die Kontrolle nicht an die VCL gibt, dann solltest zumindest ein "ProcessMessages" ausführen. z.B.:
Delphi-Quellcode:
for var i := 1 to 1000 do
begin // tue irgendwas Sleep(10); // Botschaftsverarbeitung Application.ProcessMessages; end; |
AW: Showmodal sperrt zyklisches Event
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo !
Habe mal ein Beispielprogramm hochgeladen. Wenn auf den Button geklickt wird, dann kommt es ab und zu vor das der Timer nicht mehr getriggert wird. Immer wenn ich den Klick in der Ausführung des Events hinbekomme ! Gruß Rainer |
AW: Showmodal sperrt zyklisches Event
Ein modales Fenster unterbricht die Ausführung des aufrufenden Fensters, also in Deinem Fall auch die Ausführung des Timers. Musst Du das Fenster modal anzeigen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz