AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Bitmaps in Threads, Animation von Algorithmen
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmaps in Threads, Animation von Algorithmen

Ein Thema von Gausi · begonnen am 19. Mär 2007 · letzter Beitrag vom 22. Mär 2007
Antwort Antwort
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#1

Bitmaps in Threads, Animation von Algorithmen

  Alt 19. Mär 2007, 11:39
Ich versuche, diverse Suchalgorithmen zu animieren, d.h. dem Nutzer soll in Form von Bildchen angezeigt werden, was ein Algorithmus so tut. Dafür habe ich in den Schleifen und if-Abfragen der Algorithmen entsprechende Animationssequenzen eingebaut. Prinzip ist so, dass zunächst in ein Bitmap gemalt wird, was dann in eine Paintbox kopiert wird. Da ich auch mehrere Algorithmen gleichzeitig animieren möchte, habe ich das ganze in eine Thread-Klasse ausgelagert. Diese sieht auszugsweise so aus:
Delphi-Quellcode:
type
  TRepaintProc = procedure(Mode: Integer; aBitmap: TBitmap) of Object;

TPatternmatchAnimator = class(TThread)
  private
    OffscreenBmp: TBitmap;
    fMode: Integer;
    fRepaintProc: TRepaintProc;
    procedure RefreshAnimation;

//...

procedure TPatternmatchAnimator.Execute;
begin
  // das ist natürlich Pseudocode ;-)
  do "GanzOft"
     PaintSomethingOn_OffScreenBitmap.Canvas;
     Synchronize(RefreshAnimation);
     Sleep(aWhile);
end;

procedure TPatternMatchAnimator.RefreshAnimation;
begin
  fRepaintProc(fMode, Offscreenbmp);
end;
Erzeugt und gestartet wird der Thread so, bzw. die Threads. Es sind mehrere, je nach Mode wird intern ein anderer Algorithmus verwendet.

Delphi-Quellcode:
//globale var
var PatternmatchAnimators: Array[0..3] of TPatternmatchAnimator;
//...
procedure TForm1.BtnThreadedSearchClick(Sender: TObject);
begin
  for i := 0 to 3 do
  begin
      PatternmatchAnimators[i] := TPatternmatchAnimator.Create(True);
      PatternmatchAnimators[i].FreeOnTerminate := True;
      PatternmatchAnimators[i].RepaintProc := Form1.ReFreshPaintbox;
      PatternmatchAnimators[i].Mode := i;
      //...
  end;
  for i := 0 to 3 do
    PatternmatchAnimators[i].Resume;
end;
// Die Refresh-Prozedur sieht so aus:
procedure TForm1.ReFreshPaintbox(Mode: Integer; aBitmap: TBitmap);
begin
  case Mode of
      0: Paintbox0.Canvas.Draw(0,0,aBitmap);
      1: Paintbox1.Canvas.Draw(0,0,aBitmap);
      2: Paintbox2.Canvas.Draw(0,0,aBitmap);
      3: Paintbox3.Canvas.Draw(0,0,aBitmap);
    end;
end;
Dabei tritt folgendes Problem auf: Solange die Maus nicht auf meiner Form ist (und ich das ganze über "Enter" gestartet habe, wenn der Start-Button den Fokus hat), läuft das ganze munter durch, bei langen Beispielen auch mehrere Minuten. Bewege ich jedoch die Maus auf der Form, kommt die Animation ins Schleudern, d.h. das Bild sieht nicht so aus, wie es aussehen sollte und/oder wird gar nicht mehr aktualsiert. Ab und zu erzeugt dann auch der eine oder andere "Offscreenbmp.Canvas.MaleWas" einen Fehler "Leinwand erlaubt kein Zeichnen".

Da das Fehlverhalten leicht reproduzierbar ist, nehme ich an, dass die Threads (einer reicht dafür aber auch aus) sich nicht mit einer Abarbeitung der Nachrichtenschleife des VCL-Hauptthreads vertragen (denn das passiert ja, wenn man z.B. die Maus auf der Form bewegt, auch wenn diesem Event nichts zugewiesen ist). Jemand ne Idee, was ich falsch mache?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Bitmaps in Threads, Animation von Algorithmen

  Alt 21. Mär 2007, 13:15
Hat das hier keiner gelesen, oder weiß einfach keiner ne Antwort?

Ich push hier mal, und füge das ganze Projekt bei - wie in der EE auch. Wäre nett, wenn mal einer drübergucken könnte, der sich etwas auf dem Gebiet "Threads" auskennt.

Zur Info: Da werden String-Matching-Algorithmen animiert. Oben der naive, darunter der von Knuth, Morris und Pratt, ganz unten Boyer-Moore. Der freie Platz ist für ne (schlechtere) Variante von KMP, die aber noch nicht implementiert ist.
Angehängte Dateien
Dateityp: zip animationsprogramm_exe_528.zip (231,4 KB, 11x aufgerufen)
Dateityp: zip animationsprogramm_132.zip (19,8 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: Bitmaps in Threads, Animation von Algorithmen

  Alt 21. Mär 2007, 13:44
Habe gerade einen kleinen Fehler gefunden:

Delphi-Quellcode:
// Berechnung des Bad-Character-Shifts
procedure TPatternMatchAnimator.PreProcess_BM_BadCharacter;
var i, m: Integer;
begin
  m := Length(fPattern);
  FillMemory(fBM_BC, sizeof(fBM_BC), 0); // find ich schneller und einfacher -.-^^

  { // Fehler bei Bereichsüberprüfung //
  for i := 0 to m do
    fBM_BC[Ord(fPattern[i])] := i;  // Strings (fPattern) beginnen mit 1                             
  }


  for i := 1 to m do
    fBM_BC[Ord(fPattern[i])] := i;
end;

Schalte mal in deinen Compilereinstellungen Range checking, I/O checking und Overflow checking mit ein.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Bitmaps in Threads, Animation von Algorithmen

  Alt 21. Mär 2007, 19:24
Danke schonmal. Das war tatsächlich ein Fehler. Aber das Problem wird dadurch leider nicht gelöst.

Compilersettings hab ich mal umgesetzt, und das schien ja die einzige Stelle mit dieser Art Fehler zu sein. Ist denn das Verfahren, wie ich das Zeichnen in den Threads erledige so richtig, oder stolpert der da über irgendein nicht-Thread-sicheres Ding? Aber wenn ich ein tBitmap in dem Thread erstelle, dann sollte man doch auch frei auf dessen Canvas zugreifen können, oder?
Und wenn ich dieses Bitmap dann in einer Synchronisierungs-Prozedur nach außen hin weitergebe, sollte das doch eigentlich auch glatt durchgehen, oder?
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

Re: Bitmaps in Threads, Animation von Algorithmen

  Alt 22. Mär 2007, 16:55
Äh ja, wollt ich ja noch dazuschreiben. Sorry.

Ja, Canvasopperationen bzw. GDI Sachen sind nicht Threadsicher.

Was ich dir vorschlagen würde ist die Berechnung im/in den Thread(s) durchzuführen.
Die graphische Ausgabe allerdings im Hauptthread also der Anwendung zB. über einen Timer erledigen lassen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Bitmaps in Threads, Animation von Algorithmen

  Alt 22. Mär 2007, 18:03
Jupp, die Antwort kam im DF auch eben. Und das scheint auch die Lösung zu sein. Danke auch hier für die Mühe .

Nen Timer nehme ich aber nicht, sondern übergebe der VCL-Mal-Routine vom Thread aus die nötigen Parameter, die zum Zeichnen benötigt werden. Das Zeichnen wird dann nicht in einem bestimmten Intervall erledigt, sondern immer dann, wenn der Thread meint, man sollte was zeichnen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:50 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