Entwickler-Ecke

Multimedia / Grafik - application.process messages sonstige Prog. rucklig


Delphianer23 - Di 18.03.03 21:50
Titel: application.process messages sonstige Prog. rucklig
Ich hab ne (lange) Schleife, die auf ein Bitmap bestimmte Pixel setzt. (mit scanline) Damit ich in der Zeit noch arbeiten kann, hab ich Application.processmessages eingebaut.

Wenn ich allerdings in dieser SChleife Application.processmessages benutze, kann ich meinen MAuszieger nur noch ruckelig bewegen. Da hab ich ein sleep(1) eingebaut. Das gewährleistet das ruckelfreie Bewegen, doch macht in der Summe schon 5 Sekungen aus ...

Warum funzt der Befehl (application.processmessages) dort nicht so wie er z.B bei einer meinen reinen Berechnungssschleifen funktioniert?

Lösungen ? Erklärungen?

(Der Befehl wird oft genug ausgeführt ...)


Motzi - Mi 19.03.03 11:35

Application.ProcessMessages gewährleistet nur, dass die Message-Queue abgearbeitet wird. Wenn du jetzt eine rechenaufwändige Funktion hast in welcher du ProcessMessages aufruft, so kannst du zwar Messages verarbeiten, aber die CPU wird dennoch voll ausgelastet. Mit Sleep() kannst du deinen Thread schlafen legen, so dass die CPU die Zeit und Möglichkeit hat sich anderweitigen Aufgaben zuzuwenden.

Eine Möglichkeit wäre jetzt also zB. Sleep() nur bei jedem 10ten Schleifendurchlauf aufzurufen.


Andreas Pfau - Fr 21.03.03 20:46

Wenn du mit Scanlines arbeitest, dann hast du doch sicher 2 Schleifen, oder (eine für Zeilen, eine für Spalten)? Dann kannst du einfach ProcessMessages() bei der Zeilen-Schleife ausfrufen.

Oder, die perfekte Lösung: einen Thread für die Scanline-Prozedur. Dann läuft alles Reibungslos. Sollte es dennoch ruckeln, oder zu langsam sein, kannst du immer noch mit der Thread-Priorität rumspielen.


Delphianer23 - Fr 21.03.03 21:20

das mit processmessages in der Schleife hab ich doch.
(Ich hatte app.process auch mal überall, funzt es auch nicht,es hängt glaub ich an dem Befehl scanline, der was außer Kraft setzt)

Wie macht man dass mit den Threads?
(Hab schon was drüber gelesen, aber weiß nicht genau wie ich anfangen
soll ...)

Hilfe...


Andreas Pfau - Fr 21.03.03 21:28

Datei/Neu/Thread-Objekt

In TThread.Execute schreibst du deine Prozedur. Dann erstellst du im Hautformular eine Variable (angenommen dein Thread heißt TImageProcessor):

Quelltext
1:
2:
3:
4:
var
  ImageProcessor: TImageProcessor;
begin
  ImageProcessor := TImageProcessor.Create(False);


Wenn der Thread fertig ist, solltest du das Fenster informieren, z.B. mit einer Message oder mit einem Flag oder 'nem Event oder sonstwie.

Ich würde dir ein Tutorial empfehlen (google).


Motzi - Sa 22.03.03 14:47

Delphianer23 hat folgendes geschrieben:
das mit processmessages in der Schleife hab ich doch.
(Ich hatte app.process auch mal überall, funzt es auch nicht,es hängt glaub ich an dem Befehl scanline, der was außer Kraft setzt)


Die Erklärung warum es ruckelt bzw warum es mit Sleep nicht ruckelt hab ich doch oben schon gepostet...! :?


Delphianer23 - Sa 22.03.03 15:39

es ruckelt nicht, man kann gar nichts mehr machen. Außerdem müsste wie ich es bei einer andren NUR rechenfunktion habe, die bis zu 5 Min dauern kann, dann auch so sein. Wenn man app.process oft genug aufruft, hat man dann halt z.b 60 MAus befehlsabrufe in der sec, das langt.

Was ruckelt ist der Mauszeiger ...

Moderiert von user profile iconTino: Absätze entfernt.