![]() |
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:
Ich rufe einmal INIT auf und danach nur UPDATE.
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; 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 ??? |
AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Delphi-Quellcode:
Hilft das ?
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; ,,, Aber ich glabe eher da ist irgendwas anders mit Threads im Gange bei dir. Rollo |
AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Zitat:
|
AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Zitat:
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 :) |
AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Zitat:
Zitat:
![]() |
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. |
AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Zitat:
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. |
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. |
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 ... |
AW: Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz