AGB  ·  Datenschutz  ·  Impressum  







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

TApplication.OnIdle Event

Ein Thema von freimatz · begonnen am 6. Aug 2020 · letzter Beitrag vom 10. Aug 2020
Antwort Antwort
freimatz

Registriert seit: 20. Mai 2010
1.386 Beiträge
 
Delphi 11 Alexandria
 
#1

TApplication.OnIdle Event

  Alt 6. Aug 2020, 17:43
Hallo zusammen,
kann mir wer nähere Infos geben, wann denn das TApplication.OnIdle Event kommt.
Mit google finde ich das: http://docs.embarcadero.com/products...on_OnIdle.html

Was heisst "An application is idle when it is not processing code.".

Wenn ich hier eine App starte, dann erscheint zuerst ein Splash-Screen und bin ich schon im OnIdle bevor überhaupt das Hauptfenster offen ist. Da komme ich dann immer wieder vorbei. ("Done" wird nicht verändert, ist auf True)
Kann es sein, dass es an einem Timer liegt, der regelmäßig kommt?

Wenn ich im Callstack schaue, dann komme ich daher:
Delphi-Quellcode:
procedure TApplication.HandleMessage;
var
  Msg: TMsg;
begin
  if not ProcessMessage(Msg) then Idle(Msg);
end;
Könnte man vereinfacht sagen, OnIdle kommt sobald alle Windows-Botschaften abgearbeitet sind?
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.858 Beiträge
 
Delphi 12 Athens
 
#2

AW: TApplication.OnIdle Event

  Alt 6. Aug 2020, 20:39
So wie ich es verstehe wird zumindest unter Windows OnIdle immer dann aufgerufen, wenn keine Botschaften zu verarbeiten sind. Schubst du also eifrig die Maus oder klimpert mit der Tastatur, wird es kaum zum Zug kommen.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
746 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 01:33
Schubst du also eifrig die Maus..., wird es kaum zum Zug kommen.
Für den von freimatz beschriebenen Fall done=true ("OnIdle is called only once, as the application transitions into an idle state."): Das Gegenteil ist der Fall. Windows sendet dann haufenweise WM_MOUSEMOVEs an deine App, was zu haufenweise zusätzlichen "OnIdles" führt.

Kann es sein, dass es an einem Timer liegt, der regelmäßig kommt?
Wenn du wissen willst nach welchen WM_xxx Meldungen dein Idle(.) ausgelöst wird, dann könntest du die WM_xxx zwischen zwei Idles ja abspeichern (zum Beispiel via TApplicationEvents OnMessage).

Du schreibst nicht, was du in deinem OnIdle Handler tust. Eventuell könntest du die Dinge woanders tun (?).
Michael Gasser
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.386 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 11:10
Hallo,
Danke für die Hinweise. Dann ist es mir so ungefähr klar wie das OnIdle funktioniert. Es geht dann wohl nur um Windows-Botschaften. Wenn im Hintergrund noch ein Thread vor sich hinwerkelt wird das nicht berücksichtigt - oder? Dann wäre die Doku etwas irreführend.

Ich wollte das was ich in OnIdle machen will, nicht gleich woanders machen sondern zuerst mal verstehen.

In meinem Anwendungsfall gibt es auch niemand der die Maus schubst oder Tasten drückt. In dem Fall hat man eine TAction ausgelöst und unsere Testautomatisierung will wissen wenn sie weiter machen kann.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.858 Beiträge
 
Delphi 12 Athens
 
#5

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 11:23
OnIdle ist in der Tat unabhängig von irgendwelchen Threads die du erzeugt hast.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.890 Beiträge
 
Delphi 12 Athens
 
#6

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 16:16
OnIdle ist in der Tat unabhängig von irgendwelchen Threads die du erzeugt hast.
Naja, Es wird ja geraten CheckSynchronize in OnIdle auzurufen.

Wenn man das macht, dann hat es aufeinmal ne Menge einfluss auf Threads die ihre Ausgabe mit dem Hauptthread synchronisieren.
Edit:
Hab gerade bemerkt das CheckSynchronize nie bei mir aufgerufen wird und Synchronize trotzdem ordnungsgemäß funktioniert...könnte das an FMX liegen oder an System.Classes.WakeMainThread ?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 7. Aug 2020 um 16:34 Uhr)
  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 08:14 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