Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Warten bis der OnIdle-Eventhandler fertig ist (https://www.delphipraxis.net/22150-warten-bis-der-onidle-eventhandler-fertig-ist.html)

TStringlist 13. Mai 2004 05:24


Warten bis der OnIdle-Eventhandler fertig ist
 
Hallo,

folgende Situation macht mir gerade etwas Kopfzerbrechen: In einem OnIdle-Eventhandler rufe ich eine bestimmte Routine-A auf, deren Abarbeitung gelegentlich auch mal etwas länger dauern kann ...und weswegen ich in diese Routine-A auch noch eine Application.ProcessMessages – Anweisung eingebaut habe. Wird nun während der Abarbeitung dieser Routine-A dann eine Keyboard-Taste gedrückt, so kommt es also (auch "während" diese Routine-A gerade abgearbeitet wird) trotzdem zum gewünschten Aufruf des OnKeyDown-Eventhandlers. So, und hier (in diesem OnKeyDown-Eventhandler) geht es nun darum, dass bei einer ganz bestimmten Key-Eingabe ich die dortige Programmausführung nun quasi solange parken möchte bzw. sie wieder an die OnIdle-initiierte Routine-A zurückgeben möchte, bis diese besagte Routine-A dann zu Ende abgearbeitet wurde und der OnIdle-Eventhandler wieder returniert hat. Danach erst, möchte ich dann die Arbeiten im OnKeyDown-Eventhandler fortführen.

Hört sich irgendwie einfach an, aber im Moment komme ich einfach nicht drauf, wie man diese Rückgabe der Programmausführung an diese besagte Routine-A am besten bewerkstelligen könnte... um, wie gesagt, erst nach der Beendigung des OnIdle-Eventhandlers dann die Arbeiten im OnKeyDown-Eventhandler wieder fortzusetzen.

Gibt's dazu eventuell irgendein spezielles Verfahren oder ähnliches?

Thx im Voraus

alcaeus 13. Mai 2004 05:31

Re: Warten bis der OnIdle-Eventhandler fertig ist
 
Ja, TimerRoutine setzen, dort kommt der Code rein, der nach dem Abarbeiten von OnIdle gemacht werden soll. Im OnKeyDown setzt du dann am Ende Timer1.Enabled := True, und dann springt das Programm zurück in die OnIdle. Am Ende der OnIdle wird dann der Rest von OnKeyDown wegen des Timers ausgeführt. Allerdings musst du am Anfang der OnTimer-Routine Enabled wieder auf False setzen.
Falls du in der OnIdle allerdings ProcessMessages verwendest, so musst du den Umweg so machen:
Delphi-Quellcode:
//in OnKeyDown:
Timer1.Tag := 1;
//...
//in OnIdle:
//...
Timer1.Enabled := Timer1.Tag = 1;
Timer1.Tag := 0;
Ich hoffe das Prinzip ist einigermaßen verständlich

maximov 13. Mai 2004 14:17

Re: Warten bis der OnIdle-Eventhandler fertig ist
 
Was hast du denn vor? Hört sich so an, als ob da threads viel sinnvoller wären...wegen unterbrechung von routinen wärend der ausführung und späteres weiterfahren.

TStringlist 13. Mai 2004 14:54

Re: Warten bis der OnIdle-Eventhandler fertig ist
 
Hi, Thx erstmal beiden, aber die Situation ist so, dass ich das OnKeyDown eigentlich gar nicht zu Ende machen kann, sondern darin an einer ganz bestimmten Stelle diese Routine-A da selbst nochmal aufrufe. Und wenn ich die nun aber schon im OnIdle angefangen habe, dann soll sie diesbezüglich also jetzt einfach nur zu Ende gebracht werden. Solange möchte ich dann im OnKeyDown quasi nur anhalten, weil ich von der Arbeit dieser Routine-A im Weiteren dann ja auch wieder abhängig bin.

Aber auch wenn ich im OnKeyDown returnieren würde, würde der Programmablauf in der Routine-A nicht fortgesetzt, sondern der (Programmablauf) würde dann zuerst weiter in Richtung OnKeyPress, OnSelectChange und OnChange-Eventhandler weitermarschieren. Und davor sollte das Ergebnis von Routine-A ja schon längst fertig vorliegen bzw. verfügbar sein.


Zur Not gänge auch ein Abbruch der Routine-A, um diese dann einfach im OnKeyDown selbst nochmal ganz neu aufzurufen - aber das geht auch irgendwie nicht (hmmmmm ...es sei denn, ich definierte so etwas wie eine immer weiter fortlaufende Aufrufnummer für diese Routine-A ...mit der ich, wenn ich irgend-irgendwann mal wieder zu dieser Routine-A zurückreturniere würde (die einst im Auftrage des OnIdle aufgerufen war), dann feststellen könnte, dass es in der Zwischenzeit schon einen weiteren Aufruf gegeben hat und womit dieser dann jetzt also überholten Aufruf sofort abzubrechen wäre).


Leider muss ich gestehen, Threads bisher noch nie nötig gehabt zu haben... Event. könnte es also sein, dass die hier eine Lösung wären?

(...werde mir letzteres Thema heute abend doch mal etwas genauer ansehen.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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