![]() |
Darstellungsproblem bei Programmausführung
Moin,
ich habe ein Programm das 2 Dateien(900 Datensätze / 252.000 Datensätze) einliest. Diese Daten schreibe ich in Arrays und vergleiche sie. Beim vergleich friert das Programm ein. Folgende Probleme entstehen. 1. Programm reagiert nicht mehr auf Tasteneingaben oder Mauseingaben sowie auf minimieren und maximieren, erst am Ende des Vergleiches. 2. Wechsel zu ein anderem Programm und dann zurück -> wird nicht aktiv und läßt sich anzeigen Kennt einer das Problem bzw. weiß wie ich die Anzeige effektiv aktualisiere bzw. die Minimierung / Maximierung des Programmes nutzen kann? Danke. Sven |
Re: Darstellungsproblem bei Programmausführung
Machst du das in einer WHILE bzw FOR Schleife. Dann rufe gelegentlich Application.ProcessMessages...
|
Re: Darstellungsproblem bei Programmausführung
Statt application.processmessages machen bei rechen- bzw. zeitintensiven Programmabläufen Threads mehr Sinn.
|
Re: Darstellungsproblem bei Programmausführung
Moin,
danke für euere Antworten. Ich bearbeite die Dateien mit For-Schleifen. Da ich mit euren Vorschlägen noch nicht gearbeitet habe bzw. mir nicht so wirklich erklären kann, wie man damit umgeht, könnte ihr mir kurz den Sinn erklären zum Thema: Application.ProcessMessages & Threads Danke. Sven |
Re: Darstellungsproblem bei Programmausführung
Threads laufen parallel zu deinem Hauptprozess ab, ohne diesen zu stören. D.h. du kannst dein Programm weiterhin ganz normal bedienen, während im Hintergrund gearbeitet wird. Unter den Delphi Demos such mal nach SortThread o.ä., da ist ein schönes Beispiel dabei. in der hilfe findest Du auch einiges zu TThread.
|
Re: Darstellungsproblem bei Programmausführung
Zitat:
währen deine Schleife durchlaufen wird kommt dein Programm nicht dazu die Nachrichten "die es von Windows bekommt" zu verarbeiten. Es kann also nicht auf ein verschieben des Fensters, Buttonsklicks oder sonst etwas reagieren. Selbst das neuzeichnen von Labels findet nicht stat. Durch den Aufruf von ![]() Hier mal drei Beispiele:
Delphi-Quellcode:
Wie man an den Zeiten sieht ist es aber nicht unbedingt klug ProcessMessages bei jedem Durchlauf aufzurufen da natürlich auch die Abarbeitung der Methode einiges an Zeit braucht.
var
start: cardinal; ende: cardinal; // Ohne Application.ProcessMessages // Bei mir ca 2000 ms procedure TDemoForm.btn_Test1Click(Sender: TObject); var ndx: integer; begin start := GetTickCount; for ndx := 0 to 100000 do begin lbl_Counter.Caption := IntToStr(ndx); end; ende := GetTickCount; ShowMessageFmt('Zeit %d', [ende - start]); end; // Mit Application.ProcessMessages // Bei mir ca. 12000 ms procedure TDemoForm.btn_Test2Click(Sender: TObject); var ndx: integer; begin start := GetTickCount; for ndx := 0 to 100000 do begin lbl_Counter.Caption := IntToStr(ndx); Application.ProcessMessages; end; ende := GetTickCount; ShowMessageFmt('Zeit %d', [ende - start]); end; // Mit Application.ProcessMessages beil allen maxloop Durchläufen. // Bei mir ca. 3500 ms procedure TDemoForm.btn_Test3Click(Sender: TObject); const maxloop = 10; var ndx: integer; lcount: integer; begin start := GetTickCount; lcount := maxloop; for ndx := 0 to 100000 do begin lbl_Counter.Caption := IntToStr(ndx); Dec(lcount); if (lcount = 0) then begin Application.ProcessMessages; lcount := maxloop; end; end; ende := GetTickCount; ShowMessageFmt('Zeit %d', [ende - start]); end; Darum habe ich in Test3 einfach bestimmt das dies nur bei jedem zehnten Durchlauf passieren soll. Welchen Wert Du hier nimmst ist von deinem Anwendungsfall abhängig. Ich hoffe es zeigt in etwas worum es geht. |
Re: Darstellungsproblem bei Programmausführung
danke, das hilft mir weiter.
MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 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