AGB  ·  Datenschutz  ·  Impressum  







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

Label in Schleife zeichnen lassen

Ein Thema von Gruber_Hans_12345 · begonnen am 23. Mär 2022 · letzter Beitrag vom 25. Mär 2022
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 08:16
Was mir auch komisch vorkommt.
Wenn ich es mit dem Debuger durchgehe, und nebenbei das Fenster sehe.

Dann sehe ich das wenn er den FillRect macht, ist der Text im Fenster weg (logisch)
Aber nach dem DrawText, sieht man im Fenster noch nix.
Erst wenn er das nächste mal wieder zum FillRect kommt im Debugger, dann sehe ich im Fenster das nun der alte Text da steht.
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 09:41
Hallo,
1 bis 1.000.000 zählt.

Willst Du jetzt 1.000.000 neu zeichnen.
Macht für mich keinen Sinn.

Besser z.B. in bestimmten Zeitpunkten (hier alle 1000)

Delphi-Quellcode:
if (i mod 1000)=0 then
begin
  Label.Caption:= 'bla';
  Application.ProcessMessages;
end;
Heiko
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 09:45
nein, ich zeichne nur alle 20ms sowas
Delphi-Quellcode:
if (fLastRepaint = 0) or (fRepaintEvery = 0) or (GetTickCount > fLastRepaint+fRepaintEvery) then begin
  fLastRepaint := GetTickCount;
  Label1.Paint;
end;
aber ich will eben keine ProcessMessages, sondenr nur das .paint
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#4

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 10:19
Vielleicht wäre es sinnvoller mit einem Thread und einer threadbasierten Anzeige zu arbeiten. Ich habe hier vor einiger Zeit ein paar multithreadfähige Komponenten angefangen:
https://github.com/jaenicke/MTCL
Damit kannst du ein zweites Fenster aufmachen und direkt aus einem Thread heraus ohne Synchronisierung aktualisieren. Dann brauchst du auch kein ProcessMessages.

Es gab dafür offenbar kein Interesse, deshalb habe ich da nicht viel weiter gemacht, aber grundlegende Funktionen (Textanzeige, Fortschjrittsanzeige, Positionierung, Schriftarten) sind vorhanden, siehe Demo.

Mein nächstes Ziel ist z.B. die Implementierung von Anchors.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
258 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Label in Schleife zeichnen lassen

  Alt 25. Mär 2022, 08:35
nein, ich zeichne nur alle 20ms sowas ... aber ich will eben keine ProcessMessages, sondenr nur das .paint
Willst Du eine Statusausgabe für den Progress in einem Thread?

Ich empfehle die Verwendung einer gelockten globalen variable/record. Im einfachsten Fall verwende einfach
TInterlocked.Increment(FMyProgress);
TInterlocked.Increment(FMyProgressHasChanged);

Du kannst in deiner UI einen Timer nehmen und dort alle X ms abfragen ob sich FMyProgressHasChanged geändert hat, und wenn ja dein Label/UI mit den Daten aus FMyProgress zu aktualisieren.

Schau Dir mal die Klasse TMultiReadExclusiveWriteSynchronizer an. Damit kann man sehr effektive Locks realisieren. Das Prinzip ist immer, dass ein Thread nur auf seinen Daten arbeitet und einen gelockten 2. Datensatz dafür verwendet, bei Bedarf Daten dem Hautpformular zur Verfügung zu stellen.

Ich empfehle einen riesen Bogen um TThread.Synchronize zu machen. Das Ding hätte nie erfunden werden sollen.

Falls es nicht um threads geht schau mal hier: https://www.delphipraxis.net/1503595-post7.html
Vielleicht reicht auch schon ein Label1.Update.
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF

Geändert von jziersch (25. Mär 2022 um 08:38 Uhr)
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Label in Schleife zeichnen lassen

  Alt 25. Mär 2022, 11:11
Ja will das ganze ohne Thread.

und ja das TLAbel.Update sieht zumindest auf den ersten Blick mal genau nahc dem aus was ich brauche Danke
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Label in Schleife zeichnen lassen

  Alt 25. Mär 2022, 11:13
Das mit dem Thread klingt zwar auch sehr interessant, werde mir das bei Gelegenheit auch mal anschauen, sowas könnte ich für den Fortschritt bei sql Abfragen vorstellen.
Vorallem, wenn das .Open mal länger dauert, das man nicht glaubt alles ist gerade tot (das sql.Open MUSS teils im Hauptthread passieren - daher Progress oder "ich bin nicht tot" anzeige dann ausgelagert)

Aber für den aktuellen Fall zu oversized
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
717 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Label in Schleife zeichnen lassen

  Alt 25. Mär 2022, 11:22
(das sql.Open MUSS teils im Hauptthread passieren - daher Progress oder "ich bin nicht tot" anzeige dann ausgelagert)
Nur, wenn dein Haupttread gerade im Open hängt wird das schwierig mit dem Anzeigen von Fortschritt.
Denn der ganze visuelle Kram den dein Programm und alle Fenster machen hängt da ja auch drinne. Manche DB Komponenten bieten dafür ein Event an was von Zeit zu Zeit feurt. Da kann man dann Application.ProcessMessages aufrufen um das programm lebendig zu halten wären der Hauptthread in wirklichkeit woanders ist.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
268 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Label in Schleife zeichnen lassen

  Alt 25. Mär 2022, 15:36
Eventuell eine andere Komponente zur Ausgabe, z.B. TPanel, da könnte man doubleBuffered aktivieren.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  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 01:54 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-2025 by Thomas Breitkreuz