Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TParallel : "Kein Eigentümer der Objektsperre" (https://www.delphipraxis.net/182864-tparallel-kein-eigentuemer-der-objektsperre.html)

Harry Stahl 22. Nov 2014 16:39

TParallel : "Kein Eigentümer der Objektsperre"
 
Habe nun bestimmte Rechenoperationen für Bitmaps mit TParallel.Task gelöst.

Bei Zeichenaktionen (z.B. mit einem Werkzeug über eine Grafik malen) kommt dann hin und wieder die Meldung:

"Kein Eigentümer der Objektsperre".

Nehme mal an, dass irgendwo ein Zeichenevent ausgelöst wird, während eines der zu zeichnenden Bitmaps in der TParallel.Tasks berechnet wird.

Wie löst man das am Besten:

Ein Lock vor der TParallel-Berechnung auf das Bitmap setzen und hinterher wieder freigeben und dann bei allen Zeichenaktionen prüfen, ob ein Lock auf dem Bitmap ist und z.B. so lange warten, bis das wieder frei ist?

Uwe Raabe 22. Nov 2014 16:52

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Vielleicht auf einer Kopie der Bitmap arbeiten und am Ende die Instanzen austauschen?

Harry Stahl 22. Nov 2014 18:06

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Wie tauscht man denn bei Bitmaps richtigerweise die Instanzen aus?

Temporäres Bitmap erzeugen, Original zuweisen, mit Temp-Bit arbeiten, am Ende wieder dem Original das Tempbit zuweisen?

Delphi-Quellcode:
  BitUnten := Tbitmap.Create;
  BitUnten.Assign (BitUntenA);

  // mit BitUnten arbeiten
  BitUntenA.Assign(BitUnten);
  BitUnten.Free;

Bernhard Geyer 22. Nov 2014 18:22

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Zitat:

Zitat von Harry Stahl (Beitrag 1280761)
Habe nun bestimmte Rechenoperationen für Bitmaps mit TParallel.Task gelöst.

Bei Zeichenaktionen (z.B. mit einem Werkzeug über eine Grafik malen) kommt dann hin und wieder die Meldung:

"Kein Eigentümer der Objektsperre".

Zeichnen? Ich hoffe doch nicht über die WinAPI? Das eigentliche Problem das die VCL nicht Threadsafe ist, ist das die GDI/Fenster-Handels Thread-Affin sind. D.h. das sie nur im erzeugenden Thread.
gültig sind.

Uwe Raabe 22. Nov 2014 18:29

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Zitat:

Zitat von Harry Stahl (Beitrag 1280777)
Wie tauscht man denn bei Bitmaps richtigerweise die Instanzen aus?

So geht's etwas schneller:
Delphi-Quellcode:
  BitUnten := Tbitmap.Create;
  BitUnten.Assign (BitUntenA);

  // mit BitUnten arbeiten
  BitUntenA.Free;
  BitUntenA := BitUnten;
[/QUOTE]

Harry Stahl 22. Nov 2014 18:37

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also, es geht um diese Situation (vgl. auch anliegenden Screenshot):

Habe ein Bild, das aus mehreren Ebenen besteht. Das berechnete Ergebnis wird auf den Canvas einer Paintbox ausgegeben.

Nun kann man mit dem Zeichenstift über das Bild malen. Ich prüfe währenddessen, welche in welchem Bereich gemalt wird, übertrage diese Zeichenaktion auf den Ausschnitt der gerade bemalten Ebene und berechne alles neu und zeige es wieder auf dem Canvas der Paintbox an.

Anscheinend findet irgendwo ändern des Bitmaps und zeichnen des Bitmaps gleichzeitig statt.

Bislang hatte ich damit keine Probleme, aber wenn ich mit TParallel mehrere Tasks verwende und den geänderten Bereich der Ebenen-Bitmap aktualisiere, kommt hin und wieder diese Fehlermeldung.

Mavarik 23. Nov 2014 10:10

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Zitat:

Zitat von Harry Stahl (Beitrag 1280780)
Anscheinend findet irgendwo ändern des Bitmaps und zeichnen des Bitmaps gleichzeitig statt.

Da arbeitest aber nicht auf der Bitmap die zum Anzeigen verwendet wird, oder?

Bernhard Geyer 23. Nov 2014 10:20

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Zitat:

Zitat von Mavarik (Beitrag 1280819)
Zitat:

Zitat von Harry Stahl (Beitrag 1280780)
Anscheinend findet irgendwo ändern des Bitmaps und zeichnen des Bitmaps gleichzeitig statt.

Da arbeitest aber nicht auf der Bitmap die zum Anzeigen verwendet wird, oder?

Das habe ich schon mit http://www.delphipraxis.net/1280778-post4.html gefragt.

Harry Stahl 24. Nov 2014 23:32

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
In gewisser Hinsicht kann das passieren, dass das Bitmap vom Anwender bearbeitet wird, gleichzeitig aber bestimmte Bearbeitungsprozesse damit parallel passieren (z.B. erkennen, welche Bereiche geändert wurden und diese dann in eine Redo/Undo Sicherung geschrieben werden).

Daher wäre hier die Frage, wie man den Zugriff auf das Bitmap am besten schützt (evtl. mit Lock?), bzw. prüft, ob das gerade irgendwie in der Verwendung ist.

thesakal 20. Feb 2019 23:23

AW: TParallel : "Kein Eigentümer der Objektsperre"
 
Kein Eigentümer der Objektsperre : Wenn man nicht bestimmen Height und Width von Bitmap before 'beginscene', es passiert diese Meldung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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