AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap.Canvas -> Form.Canvas ... nix zu sehen
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap.Canvas -> Form.Canvas ... nix zu sehen

Ein Thema von TERWI · begonnen am 9. Jul 2018 · letzter Beitrag vom 19. Jul 2018
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#21

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

  Alt 11. Jul 2018, 15:56
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 ???

Geändert von TERWI (11. Jul 2018 um 16:00 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#22

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

  Alt 11. Jul 2018, 15:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#23

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

  Alt 11. Jul 2018, 16:00
- 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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#24

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

  Alt 11. Jul 2018, 16:08
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

Geändert von TERWI (11. Jul 2018 um 16:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#25

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

  Alt 11. Jul 2018, 16:24
Warum kann ich kein TImage aus einem Thread aufrufen ?
Scheint doch so weit nach Hindernissen zu funzen
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#26

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

  Alt 11. Jul 2018, 16:41
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.

Geändert von TERWI (11. Jul 2018 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.343 Beiträge
 
Delphi 11 Alexandria
 
#27

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

  Alt 11. Jul 2018, 16:41
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#28

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

  Alt 11. Jul 2018, 16:51
quod erat demonstrandum!

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

Sagt dir der Begriff "VCL-Mainthread" bzw. "Main VCL Thread" etwas?
Da haste deinen weiteren Thread.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#29

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

  Alt 11. Jul 2018, 16:58
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 ...

Geändert von TERWI (11. Jul 2018 um 17:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#30

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

  Alt 11. Jul 2018, 17:03
Der einzige Unterschied: Ich gebrauche dort kein BitMap.
Im übrigen gilt das auch für TBitmap. Auch das ist nicht threadsicher.
Na sowas...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    

 

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 10:09 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