Einzelnen Beitrag anzeigen

Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Canvas-Methoden ab Windows 6.x / Vista oft sehr verzögert

  Alt 11. Nov 2015, 22:29
Hallo Delphifreunde!

Seit Jahren bastele ich an meinem Lieblingsprogamm, dem Sortierkino. Es läuft soweit auch zu meiner Zufriedenheit.

Einen Wermutstropfen gibt es dabei aber leider doch: Seit Windows mit der Majorversion 6 (konkret bei Windows 7, 8.1 und 10, andere stehen mir nicht zur Verfügung, ich vermute aber wegen der internen Ähnlichkeit, daß es schon ab Vista auftritt) ist irgendetwas bei der Darstellung bzw. graphischen Ausgabe oft sehr verzögert. Das zeigt sich wie folgt: Ich lasse ein Array in einer Schleife mit Linien darstellen, i.d.R. eine neue Startmenge, die es als nächste zu sortieren gilt. Oft geht das annehmbar schnell (bis Windows XP grundsätzlich), jedoch ist das ab Windows 7 oft deutlich verzögert, ja geradezu quälend langsam. Das tritt aber nur sporadisch, wenn auch ziemlich oft auf.

Nun glaubte ich, mit dem Setzen von Prioritäten im Umfeld dieser Schleife, und dabei gleich die "volle Ladung":

Delphi-Quellcode:
SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
for l:=0 to pred(Form1.SpinEdit2.Value) do linie_zeichnen(l,false);
SetPriorityClass(GetCurrentProcess,NORMAL_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_NORMAL)
diesem unerwünschten Programmverhalten ein Schnippchen schlagen zu können, aber so simpel kann ich mein Ziel nicht erzwingen. linie_zeichnen ist etwas komplexer:

Delphi-Quellcode:
procedure linie_zeichnen(x:word;darueber_loeschen:boolean);
begin
application.processmessages;
if ((Form1.ComboBox1.ItemIndex=4) or (Form1.ComboBox1.ItemIndex=20)) and not Form1.Visible
then Form2.Canvas.Pen.Color:=clblack
else Form2.Canvas.Pen.Color:=Menge[x].farbe;
Form2.Canvas.MoveTo(x,pred(Form1.SpinEdit3.Value));
Form2.Canvas.LineTo(x,Form1.SpinEdit3.Value-Menge[x].schluessel);
if darueber_loeschen then
  begin
  Form2.Canvas.Pen.Color:=clWhite;
  Form2.Canvas.LineTo(x,0)
  end;
if sortierung_laeuft and bremse_erlaubt then for x:=1 to bremse do windows.beep(0,0)
end;
Ich weiß nicht einmal, an welchen Befehlen es konkret liegt, haber aber genrell Canvas (mit seinen Methoden) im Verdacht. Ich kann auch insbesondere nicht irgendwelche Canvas-Befehle weglassen, ohne die Ausgabe bis zur Unkenntlichkeit zu verunstalten, was die Fehlersuche erschwert. Am anfänglichen application.processmessages und der ohnehin nur optionalen Bremsschleife zum Schluß liegt es jedenfalls nicht.

Ist dieses Verhalten für Canvas normal? Ist es irgendwie zu ändern? Oder hat Windows ab Vista einfach mehr Macht, in die Programmablaufgeschwindigkeit einzugreifen? Mir fällt auch oft ein verzögerter Start beim Sortieren auf, bevor das Sortieren so richtig Fahrt aufnimmt.

Was mich besonders irritiert, ist, daß es eben nur sporadisch ab Windows 7 (oder Vista?) auftrittt, aber in jedem Falle leider viel zu oft.

Vielen Dank im voraus und freundlicher Gruß

Delphi-Laie

Geändert von Delphi-Laie (12. Nov 2015 um 09:58 Uhr)
  Mit Zitat antworten Zitat