Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap.Canvas -> Form.Canvas ... nix zu sehen (https://www.delphipraxis.net/197007-bitmap-canvas-form-canvas-nix-zu-sehen.html)

TERWI 11. Jul 2018 15:56

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Hab numehr diverses zum Thema "Flackern" nachgesucht, bin aber nicht wirklich fündig geworden.
"DoubleBuffered" an/aus in der OSD-Form bringt nichts.
Beim TImage scheint es so was nicht zu geben ?

Folgendes probiert:
Delphi-Quellcode:
procedure TForm_OSD.Init(BitMap : TBitMap);
begin
  if Assigned(Bitmap) then
  begin
    Image1.Picture.Bitmap.Assign(BitMap);
  end;
end;

procedure TForm_OSD.Update(BitMap : TBitMap);
begin
  if Assigned(Bitmap) then
  begin
    Image.Picture.Bitmap.Canvas.Draw(0, 0, Bitmap);
  end;
end;
Ich rufe einmal INIT auf und danach nur UPDATE.
Das funktioniert zwar (auch) und flackert nicht - ABER:
... zeigt eine Weile meine Änderungen des FBMOSD an, bleibt dann aber einfach "stehen" (Bildinhalt bleibt da).
D.h., das wo zuvor immer blankes Panel oder flackerndes Image zu erwarten war.

Mir gehen die Ideen aus ... was ist das ?

Nachtrag:
BitMap FBMOSD hat immer den gleichen Zeiger und die gleichen Abmessungen - ist da der interne Speicher weg/woanders ???

Rollo62 11. Jul 2018 15:59

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Delphi-Quellcode:
  if Assigned(Bitmap) then
  begin
    if Image.Picture.Bitmap.Canvas.BeginScene then
    begin
       Image.Picture.Bitmap.Canvas.Draw(0, 0, Bitmap);
       Image.Picture.Bitmap.Canvas.EndScene;
    end;
,,,
Hilft das ?

Aber ich glabe eher da ist irgendwas anders mit Threads im Gange bei dir.

Rollo

Uwe Raabe 11. Jul 2018 16:00

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Zitat:

Zitat von TERWI (Beitrag 1406934)
- Jeder TS-Block wird in eigene Puffer kopiert und dann je ein Thread gestartet, der die Daten auswertet und ggf. anzeigt (Ziel: Anzeige auch eigener Fred).

Wie genau wird denn die Bitmap aus dem Thread angezeigt? Du weißt schon, daß du keine VCL-Controls (z.B. TImage) aus einem Thread heraus verwenden kannst?

TERWI 11. Jul 2018 16:08

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Zitat:

Wie genau wird denn die Bitmap aus dem Thread angezeigt? Du weißt schon, daß du keine VCL-Controls (z.B. TImage) aus einem Thread heraus verwenden kannst?
Der Thread arbeit nur in einer Schleife den TS-DatenBlock ab.
Es greift auch niemand anderes auf den Thread zu.
Der DatenBlock selbst wird wieder in Teile gesplittet und evaluiert - das Ergebnis daraus wird angezeigt.
Soweit ich das bisher feststellen konnte, ist das alles (noch) schnell genug, bevor ein neuer DatenBlock einrifft (ca. alle o,5 Sek.)
Zur Sicherheit habe ich noch ein Blocking eingebaut, das kein neuer Block akzeptiert wird, so lange der aktuelle noch nicht fertig ist.

Warum kann ich kein TImage aus einem Thread aufrufen ?
Scheint doch so weit nach Hindernissen zu funzen - aber es flackert halt ...

Ich versuche mal einen Auszug meines Threads zu posten, ohne das es den Server sprengt :)

Uwe Raabe 11. Jul 2018 16:24

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Zitat:

Zitat von TERWI (Beitrag 1406940)
Warum kann ich kein TImage aus einem Thread aufrufen ?
Scheint doch so weit nach Hindernissen zu funzen

Zitat:

Zitat von TERWI (Beitrag 1406937)
Das funktioniert zwar (auch) und flackert nicht - ABER:
... zeigt eine Weile meine Änderungen des FBMOSD an, bleibt dann aber einfach "stehen" (Bildinhalt bleibt da).

Delphi: Why VCL is not thread-safe? How can be?

TERWI 11. Jul 2018 16:41

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Hmmm ... hier arbeiten aber doch eigentlich keine 2 (oder mehr) Fredl's gegeneinander.

Diese Unit wird in einem CallBack getriggert, eingehende Daten in einen eigenen Puffer kopiert.
Danach gehts gleich zurück zum Caller - zuvor wird noch der Auswerte-Thread gestartet, der die Daten zwecks Inkonsistenz aus dem internen Puffer liest.
Und wie gesagt: So lange der Thread arbeitet (interne Kontrollvariable) werden keine neuen Daten in der CallBack-Methode akzeptiert.
Kann zu minimalem Datenverlust, bzw. erneutem warten darauf resultieren, ist aber noch nicht vorgekommen - also nicht das (Zeit-) Problem.

D.h., der Thread arbeitet stur seine Daten ab und zeigt die (normalerweise) auch nach Auswertung korrekt an.
Auch die OSD-Form (hier hilfweise als extra Form) wird von nichts & niemand anderem als genau diesem Thread aufgerufen. M.E.n kann also auch da kein Konflikt auftreten.

"ThreadSafe" muss die OSD-Form doch gar nicht, sein weil keine weiteren Fredi'S (gleichzeitig) zugreifen.
Der Thread ist ledigliglich dazu gedacht, nicht ggf. den aufruferenden Dispatcher des DS-Filters zu blockieren um nicht den Daten-Strom des restlichen Direkt-Show-Systems zu blockieren.

Diese Funktionsweise ist schon seit Jahren hier getestet und läuft ansonsten tadellos.

Hab ich da einen eklatanten Denkfehler ?

Absolut unverständlich ist mir, warum es mit einem TImage mehr oder weniger gut funzt, mit direktem Schreiben auf's Canvas der Form oder dem TImage nicht.

jaenicke 11. Jul 2018 16:41

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Zitat:

Zitat von TERWI (Beitrag 1406940)
Warum kann ich kein TImage aus einem Thread aufrufen ?

Weil die entsprechenden Klassen nicht threadsicher sind. Es ist also ein Glücksspiel. Es kann durchaus mal funktionieren, aber es gibt auch oft unerklärliche Probleme.

Im übrigen gilt das auch für TBitmap. Auch das ist nicht threadsicher. Du kannst also nicht in deinem Verarbeitungsthread eine TBitmap erzeugen und diese dann an den Hauptthread zur Anzeige weiterreichen.

Damit bin ich vor einigen Jahren einmal selbst auf die Nase gefallen.

TiGü 11. Jul 2018 16:51

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
quod erat demonstrandum! :roll:

9. Jul 2018, 21:00 Uhr - Beitrag #14

Sagt dir der Begriff "VCL-Mainthread" bzw. "Main VCL Thread" etwas?
Da haste deinen weiteren Thread.

TERWI 11. Jul 2018 16:58

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Die DVB-PSI-Abteilung meines (Langzeit-)Projekts arbeitet mit exakt den gleichen Funktionen betreff Callback und Thread samt Puffer und anderen Hilfsfunktionen. Quasi eine 1:1-Kopie.
Auch da werden Daten daraus angezeigt, gelesen, verwendet. Dort läuft alles wie "geschmiert".
Der einzige Unterschied: Ich gebrauche dort kein BitMap.

Da stört es den "VCL-(Main)thread" auch nicht die Wurst oder so ...

Uwe Raabe 11. Jul 2018 17:03

AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
 
Zitat:

Zitat von TERWI (Beitrag 1406949)
Der einzige Unterschied: Ich gebrauche dort kein BitMap.

Zitat:

Zitat von jaenicke (Beitrag 1406947)
Im übrigen gilt das auch für TBitmap. Auch das ist nicht threadsicher.

Na sowas...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.
Seite 3 von 6     123 45     Letzte »    

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