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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.202 Beiträge
 
Delphi 12 Athens
 
#1

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 16:33
Wobei CheckSynchronize im ProcessMessage schon drin ist.
Und wenn dort nichts gemacht wurde und du es dann nochmal aufrufst, dann sollte ja nichts In der SynchronizeQueue drin sein (sonst würde OnIdle nicht aufgerufen), damit dürfte CheckSynchronize nicht machen und es würde keinerlei Unterschied geben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 16:39
Wobei CheckSynchronize im ProcessMessage schon drin ist.
Und wenn dort nichts gemacht wurde und du es dann nochmal aufrufst, dann sollte ja nichts In der SynchronizeQueue drin sein (sonst würde OnIdle nicht aufgerufen), damit dürfte CheckSynchronize nicht machen und es würde keinerlei Unterschied geben.
hm,
Ich versuche ja Processmessages zu vermeiden...nur beim Anyindicator und bei Laufbalken kommt es zum einsatz.
OMG....
Das erklärt warum damals Processmessages und Threads in Kombination so Wirre effekte hervorgerufen haben. Und ich Processmessages(und Timer) deswegen ziemlich abgeschafft habe.
Gibt es eine ProcessMessages variante die nicht CheckSynchronize aufruft?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.202 Beiträge
 
Delphi 12 Athens
 
#3

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 17:22
ProcessMessages ruft in einer Schleife ProcessMessage auf (bis es nichts mehr gibt)
aber auch Application.Run führt ProcessMessage aus, was dann übrigens normalerweise deine Events (Button-Click, Tastatur, Maus, Timer, Paint, Synchronize, ...) ausführt.

Also nach deinem Event wird sowieso ProcessMessage ausgeführt
und wenn dein Event zu lange braucht, dann "kannst" Du zwischendurch auch ProcessMessage (Eins / das Erste) oder ProcessMessages (Alles) ausführen und die angefallenen Arbeiten vorziehen.

Zitat:
Gibt es eine ProcessMessages variante die nicht CheckSynchronize aufruft?
Nicht, dass ich wüsste.


Bei uns in der Firma hatte ich mal ein ProcessDrawMessage eingebaut (aber so ganz richtig kann es nie funktionieren),
da hab ich versucht mit PeekMessage/GetMessage nur Messages rauszuholen und zu verarbeiten, die keine Tastatur, Maus oder Timer sind und auch das Synchronize ist nicht drin,
um nur Zeichen- und Speicheroperationen ausführen zu lassen, aber eben keine anderen Aktionen vorzeitig reinrutschen zu lassen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Aug 2020 um 17:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.051 Beiträge
 
Delphi 12 Athens
 
#4

AW: TApplication.OnIdle Event

  Alt 7. Aug 2020, 22:10
Ich weiß jetzt nicht, ob es an der Delphi-Version liegt, aber in 10.4 wird CheckSynchronize nur in Idle aufgerufen - nicht in ProcessMessages.
Idle wird allerdings in HandleMessage aufgerufen falls keine Message vorliegt. Das ist die Methode, die in einer Dauerschleife in Application.Run aufgerufen wird. Das bedeutet aber nicht, dass ständig Idle aufgerufen wird. Bei Done = True wird am Ende von Idle ein WaitMessage aufgerufen.
Zitat:
The WaitMessage function suspends the thread and does not return until a new message is placed in the thread's message queue.
Zu häufige Idle-Events (z.B. in manchen MDI-Apps) kann man übrigens mit Application.ActionUpdateDelay bändigen.

Es gibt noch ein paar andere Events, die CheckSynchronize mittels WM_NULL auslösen, aber die sind hier eigentlich nicht von Belang.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: TApplication.OnIdle Event

  Alt 10. Aug 2020, 11:10
ProcessMessages ruft in einer Schleife ProcessMessage auf (bis es nichts mehr gibt)
aber auch Application.Run führt ProcessMessage aus, was dann übrigens normalerweise deine Events (Button-Click, Tastatur, Maus, Timer, Paint, Synchronize, ...) ausführt.

Also nach deinem Event wird sowieso ProcessMessage ausgeführt
und wenn dein Event zu lange braucht, dann "kannst" Du zwischendurch auch ProcessMessage (Eins / das Erste) oder ProcessMessages (Alles) ausführen und die angefallenen Arbeiten vorziehen.

Zitat:
Gibt es eine ProcessMessages variante die nicht CheckSynchronize aufruft?
Nicht, dass ich wüsste.


Bei uns in der Firma hatte ich mal ein ProcessDrawMessage eingebaut (aber so ganz richtig kann es nie funktionieren),
da hab ich versucht mit PeekMessage/GetMessage nur Messages rauszuholen und zu verarbeiten, die keine Tastatur, Maus oder Timer sind und auch das Synchronize ist nicht drin,
um nur Zeichen- und Speicheroperationen ausführen zu lassen, aber eben keine anderen Aktionen vorzeitig reinrutschen zu lassen.
Ich habe in aktuelleren Projekten alle langen Arbeiten in threads mit ther TAnyonymousThread Klasse(https://community.embarcadero.com/bl...tification-127) ausgelagert und Sperre die Oberfläche mit einem Halbtranparenten Rechteck auf dem ein Anyindikator liegt...
Aus gründen die ich nicht ganz verstehe...bewegt sich der Anyindicator nur wenn ich in dem Thread Synchronize mit processmessages aufrufe...
Insbesondere auch Timer und andere Message gesteuerte sachen scheinen sich nicht mit threads zu vertragen, aber zum verzögerten starten von aktivitäten brauche ich dann halt ab und zu mal eine timer der z.b. 3 sekunden nach dem ersten sichtbarwerden des Formulars loslegt...

Ich sehe gerade, dass TAsyncProgress mir vielleicht geholfen hätte...
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (10. Aug 2020 um 11:14 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 23:27 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