AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Update eines Labels aus einer Verarbeitungsschleife
Thema durchsuchen
Ansicht
Themen-Optionen

Update eines Labels aus einer Verarbeitungsschleife

Ein Thema von p80286 · begonnen am 6. Jun 2008 · letzter Beitrag vom 18. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 13:33
Hallo zusammen,

die meisten Programme, die ich schreibe, beschäftigen sich damit, Dateien zu lesen, die Daten zu verarbeiten und wieder neue Dateien zu schreiben. Da diese Dateien oft etwas größer als 100 MB sind, dauert die Verarbeitung auch etwas. Dann ist es kein Fehler den Benutzer über einen Satzzähler oder einen Fortschritsbalken oä zu informieren.
Da ich versuche die Verarbeitungsschritte von der Oberfläche zu trennen habe ich das Problem den Zähler an die Oberfläche zu übergeben.
Bisher habe ich zwei Wege beschritten:

a) Mit Hilfe des Timers lese ich eine Zählervariable in der Verarbeitungsunit aus,
b) Ich übergebe ein Label/Fortschrittbalken an die Verarbeitungsroutine. Ist der Wert des Labels <> nil dann wird der Zähler ausgegeben.

Beide Wege funktionieren.

Nun hätte ich gerne einen Tip wie ich ohne großen Overhead Oberfläche und Verarbeitung stärker entkoppeln kann. Wichtig ist daß die meiste Rechenzeit wirklich für die Verarbeitung und nicht für die Oberfläche genutzt wird.

Vielen Dank im voraus
K-H
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 13:43
ich würde die Verarbeitung in einen Thread auslagern und von diesem per PostMessage ab und zu eine Statusmeldung an den Hauptthread schicken.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hoika

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

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 13:44
Hall,

was ist denn an b) so verkehrt?
Ähnlich mache ich es auch.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 14:20
@Sir Thornberry
Da schreckt mich etwas der Aufwand (naja ich bin ein Datenschafler und von Threads habe ich keine praktische Ahnung)

@hoika
zum einen schleppe ich mir über das uses vollkommen überflüssige units in die verarbeitung ein, zum anderen steuere ich innerhalb der Verarbeitung noch die Oberfläche. Das ist sicher besser als "Man sieht, das man nichts sieht, also arbeitet er" aber die reine Lehre ist das nicht. Was meinst Du was ich geflucht habe als ich TP-Programme nach Delphi portiert habe. Da ist die Methode a) schon etwas wartungsfreundlicher weil das meiste innerhalb der Unit abläuft. Nur Fragst Du dich manchmal "wofür brauch ich eigentlich 'Zähler'".

erst einmal vielen Dank für Eure Reaktion
K-H
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#5

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 14:42
Moin, moin,

Oft habe ich zur Datenausgabe eine Variable vom Typ TStringList definiert. Die wird im Programm zunächst der Lines Eigenschaft eines TMemos oder TRichEdits zugewiesen. In den Routinen schreibe ich dann Hinweise in meine LokalStringList die in meinen Routinen fest verankert ist. Dadurch brauche ich kein visuelles Objekt in den Rechenroutinen und habe zudem eine mehrzeiliga Ausgabe.

Grüße // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 15:02
Zitat von p80286:
b) Ich übergebe ein Label/Fortschrittbalken an die Verarbeitungsroutine. Ist der Wert des Labels <> nil dann wird der Zähler ausgegeben.
Nimm lieber einen Event a la OnStep. Der kann dann nil sein, Label1.Caption setzen, ein Writeln machen oder sonstwas tun - schön entkoppelt.

HTH,
Uli.
Uli Gerhardt
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 15:06
Die Verarbeitung in einen Thread auslagern, der Threadklasse das GUI Fensterhandle überreichen und dann mit Messages arbeiten dürfte der generischste und entkoppelteste Weg sein, den du erreichen kannst. Dabei steht dir dann u.a. auch frei, ob und welche Messages du überhaupt nachher anzeigen lassen willst, und in welcher Form (Text, Gauge, Balken etc.).

Noch weiter gedacht, könnte man sich vorstellen, dass man mehrere Fenster(handles) in der Threadklasse hinterlegt, so dass evtl. sogar jeder Signaltyp (wenn man mal mehr als nur einen Counter hat) theoretisch an ein anderes Fenster gesendet werden kann. Damit könnte man dann sogar realisieren, dass eine von TEdit abgeleitete Klasse selbst auf eine Message aus dem Thread reagiert und die Anzeige übernimmt, ohne dass in einem zentralen Formular eine Verteilungslogik her müsste. Einfach direkt an diese Klasse senden lassen.

Ich denke schon, dass es sich langfristig sehr lohnen würde, sich mit Threads zu beschäftigen. Viele machen sich bei dem Thema auch oft zu viel in die Hose; es ist wirklich nicht kompliziert, wird aber wie so oft heuertage durch eine ganz tolle hochtrabende Begriffswelt verklausuliert, die erstmal nur erdrückend aussieht. Die Konzepte hinter Synchronizing, Locking, Priority, WaitForSingleObject und so weiter sind an sich recht trivial - zumindest wenn man nicht grad letzte Woche seinen ersten Compiler gekauft hat
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 15:16
Hallo zusammen,

danke für Eure Tips, da ist das Wochenende ja gerettet.

Ich werde das alles mal ausprobieren, vielleicht sind Threads ja wirklich DIE Lösung!

viele Grüße und ein schönes Wochenende
K-H
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 15:28
Zitat von Medium:
Die Verarbeitung in einen Thread auslagern, der Threadklasse das GUI Fensterhandle überreichen und dann mit Messages arbeiten dürfte
Ob das nicht auch kracht, da die problematische VCL und Threadproblematik an der Win32-GUI liegt da Fensterhandle eine Thread-Affinität besitzen: Sie dürfen nur im erzeugenden Thread angesprochen werden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Update eines Labels aus einer Verarbeitungsschleife

  Alt 6. Jun 2008, 16:10
Und wenn die den Overhead eines Thread vermeiden willst, ruf in der Schleife regelmäßig, aber nicht zu oft, Application.ProcessMessages auf. Dieser Aufruf veranlasst das Fenster seine Nachrichtenschleife abzuarbeiten. dies hat eben auch zur Folge, dass dein Label aktualisiert wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:45 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