![]() |
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
Die Thread-Instanz wird in einen Record geschrieben:
Delphi-Quellcode:
und dann wird ein
class procedure TThread.Synchronize(const AThread: TThread; AMethod: TThreadMethod);
var FSynchronize: TSynchronizeRecord; begin FSynchronize.FThread := AThread; // da FSynchronize.FSynchronizeException := nil; FSynchronize.FMethod := AMethod; FSynchronize.FProcedure := nil; Synchronize(@FSynchronize); end; class procedure TThread.Synchronize(const AThread: TThread; AThreadProc: TThreadProcedure); var FSynchronize: TSynchronizeRecord; begin FSynchronize.FThread := AThread; // oder da FSynchronize.FSynchronizeException := nil; FSynchronize.FMethod := nil; FSynchronize.FProcedure := AThreadProc; TThread.Synchronize(@FSynchronize); end;
Delphi-Quellcode:
damit aufgerufen:
TNotifyEvent
Delphi-Quellcode:
der bei einer VCL-Anwendung mit dieser Methode verbunden ist:
class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False; ForceQueue: Boolean = False);
var SyncProc: TSyncProc; SyncProcPtr: PSyncProc; begin [...] if Assigned(WakeMainThread) then WakeMainThread(SyncProcPtr.SyncRec.FThread); [...] end;
Delphi-Quellcode:
Wie man sieht, mit der schönen Instanz die mit Sender übergeben wird, wird schon mal gar nichts gemacht.
procedure TApplication.WakeMainThread(Sender: TObject);
begin PostMessage(Handle, WM_NULL, 0, 0); end; (BTW: Bei FMX sieht es auch nicht besser aus) Fazit Es ist völlig egal ob man dort eine Instanz des aktuellen Threads, oder irgendeine Instanz oder eine ungültige oder eben einfach gar keine mit
Delphi-Quellcode:
übergibt. Somit besteht kein Grund zur Sorge, wenn jemand dort eine Instanz übergibt.
nil
Darum sollte man hier auch ganz beherzt ein
Delphi-Quellcode:
übergeben, denn das ist kürzer und gaukelt auch keine sonstige Funktionalität vor.
nil
|
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
(Mal davon ausgehend, dass durch die Sammelroutine nicht noch andere Controls verändert werden). |
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
Hab' letzlich ein Programm geschrieben, dass Textdateien einliest, daraus eine Wortliste erstellt, um diesen dann als 1:n-Beziehung in 'ne Datenbank zu schreiben (dient der schnellen Suche nach Inhalten, quasi sowas wie Google light für lokale Dateien). Die Datenbankinteraktion erfolgt ausschließlich über Select- und Insert-Statements per ExecSQL, also keine datensensitiven Controls. Damit man was sieht, gibt es 'ne Progressbar, die halt alle 100 oder so ähnlich Statements eine Position weitergeht. Sonst wird nix an der Oberfläche geändert. Das Programm wird minimiert mindestens um den Faktor 10 schneller, auch dann, wenn ich auf die Progressbar verzichte. Statusänderungen, Fortschrittsanzeige mache ich nun, in dem ich alle 100 Sätze den Application.Title, bei minimiertem Programm, ändere. Dann sieht man immernoch den Fortschritt, aber die Oberfläche bleibt unsichtbar. Damit ist es (warum auch immer) deutlich schneller. Bei der großen Datenmenge, die zu verarbeiten ist, summiert sich das auf Laufzeitverkürzungen von vielen Stunden bis zu mehreren Tagen. Vermutlich sollte man sowas dann direkt als Konsolenprogramm schreiben. |
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
|
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
|
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
Zitat:
|
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
gruss |
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
Delphi-Quellcode:
) auch beim
TThread
Delphi-Quellcode:
sinnvoll verwendet wird.
TThread.Queue
Auch
Delphi-Quellcode:
ruft intern
TThread.Queue
Delphi-Quellcode:
auf und das habe ich oben erläutert.
class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False; ForceQueue: Boolean = False)
Aber bestimmt übersehe ich da etwas ... |
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
Ich bin jetzt auf Hide und Show umgestiegen, das erspart dem Rechner eine Animation abzuspielen :-) |
AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)
Zitat:
Delphi-Quellcode:
ruft
TThread.Destroy
Delphi-Quellcode:
auf und dort werden alle noch nicht erledigten Queue-Events für diesen Thread gelöscht und somit nicht mehr ausgeführt. Übergibt man beim Queue ein nil, kommen die Events auch noch an wenn der auslösende Thread schon weg ist.
TThread.RemoveQueuedEvents
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 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