Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bildschirmaufbau abgeschlossen - wie kann man das ermitteln (https://www.delphipraxis.net/108686-bildschirmaufbau-abgeschlossen-wie-kann-man-das-ermitteln.html)

JensHeinrichs 17. Feb 2008 20:37


Bildschirmaufbau abgeschlossen - wie kann man das ermitteln
 
Hallo

ich habe folgendes Problem:

Wenn ein bestimmtes Ereigniss eintritt, muß ein Bild aufgebaut und in dem Moment, wenn es komplett aufgebaut ist, mittels einer Webcam fotografiert werden. ( Die Ausgabe und die Aufnahme erfolgen über einen Beamer )

Das Problem dabei ist, daß die Aufnahme dann erfolgen muß, sobald der Bildaufbau komplett abgeschlossen ist - auf keinen Fall eher und auch nicht (viel) später.

Bisher benutze ich so etwas:


FormAufnahme.visible := TRUE; // Bild an
sleep(n); // warte, bis Aufbau fertig
.
SendMessage(FCapHandle, WM_CAP_GRAB_FRAME_NOSTOP, 1, 0); // Foto machen
.
FormAufnahme.visible := FALSE; // Bild aus



Was dabei stört, ist das sleep ... ich weiss nie so genau, wieviel Zeit ich wirklich warten müsste, bis FormAufnahme komplett aufgebaut wurde - ausserdem soll es Hardwareunabhängig laufen. Die Zeit zwischen Abschluß des Bildaufbaus und dem Zeitpunbkt der Aufnahme sollte möglichst konstant sein und darf nicht zu lange dauern - ein sleep(200-300) oder so kommt also gar nicht in Frage.

Zu den Turbo-Pascal und damit lange vor den XP, NT usw. Zeiten gab es so etwas wie WaitForRetrace - damit konnte man durch Auslesen der Register der VGA-Karte auf die Auslösung des Strahlenrücklaufsignals warten ... gibt es etwas Vergleichbares, das man für XP / VISTA anwenden kann?

Ein einfaches OnShow und OnPaint der FormAufnahme klappt leider gar nicht ...

Jens

Masteric 17. Feb 2008 22:00

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
 
Hi,
ich hoffe ich verstehe das richtig...
also du hast auf der Form das Bild,bei der du auch den sendmesage(); befehl auslöst.
dann ist das sleep ganz falsch, dann wartet das programm vor oder nach dem Bildaufbau die
Zeit ab.

Wo lädst du das Bild rein, in dem Form?

Gruß Masteric

sx2008 17. Feb 2008 23:08

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
 
statt Sleep verwende Application.ProcessMessages.

Reinhard Kern 18. Feb 2008 00:52

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
 
Zitat:

Zitat von JensHeinrichs
Hallo

ich habe folgendes Problem:

Wenn ein bestimmtes Ereigniss eintritt, muß ein Bild aufgebaut und in dem Moment, wenn es komplett aufgebaut ist, mittels einer Webcam fotografiert werden. ( Die Ausgabe und die Aufnahme erfolgen über einen Beamer ) ...

Zu den Turbo-Pascal und damit lange vor den XP, NT usw. Zeiten gab es so etwas wie WaitForRetrace ...
Jens

Hallo Jens,

ich fürchte, das geht garnicht: du könntest zwar feststellen, wann dein OnPaint alle Befehle ausgegeben hat (nur für von dir programmierte Komponenten!), aber zu dem Zeitpunkt hat die Windows GDI noch längst nicht alle Befehle ausgeführt. Sie kann daran auch durch andere Prozesse hoher Priorität BELIEBIG lange gehindert werden - Windows ist kein Real Time System, und selbst wenn es eines wäre, hätte die Anzeige keine Real Time Priorität. Übrigens geht es dann noch weiter: die Grafikkarte hat ja einen eigenen Prozessor, der die übergebenen Kommandos ja erst noch ausführen muss, eigentlich müsstest du den fragen, ob er fertig ist.

Vielleicht könntest du ganz am Schluss ein bestimmtes Pixel auf eine bestimmte Farbe setzen und das abfragen, aber ich halte es für keineswegs sicher, dass die Zeichenreihenfolge nicht in diesen Pipelines irgendwo zur Optimierung umsortiert wird.

Retrace führt in die Irre: damit konnte man feststellen, ob gerade (während des Retrace) keine Daten an den Bildschirm übertragen werden, nicht aber, ob gezeichnet wird - im Gegenteil, flimmerfreies Zeichnen im Sinn von Schreiben in den Bildspeicher findet gerade während des Retrace statt. TFTs brauchen garkein Retrace mehr.

Gruss Reinhard

mschaefer 18. Feb 2008 09:09

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
 
Deutlichen Rückgang der CPU Leistungsanforderung Deines Programms abwarten.... // Grüße // Martin

JensHeinrichs 18. Feb 2008 09:22

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
 
Hallo Reinhard,

vielen Dank für Deine Erklärungen - so etwas in dieser Richtung hatte ich schon befürchtet.

Wäre ja auch zu schön gewesen, wenns da noch etwas geben würde ...

Das mit dem Pixel auslesen werde ich auf jeden Fall mal ausprobieren.


> TFTs brauchen garkein Retrace mehr.

... iss schon klar - wollte damit auch nur verdeutlichen, wonach ich auf der Suche war.

Gruß

Jens


@Masteric:

... nein - auf der einzublendenden Form wird nichs mehr gezeichnet - die ist fertg und besteht auch nur aus einem Panel mit schwarzem Hintergrund - sonst nichts. Ich brauche die, um nur für einen sehr kurzen Momnet - und da ist das Problem ... - eine komplett schwarze Leinwand zu haben.

Ist wohl so, wie Reinhard schon erwähnte - auf die Reihenfolge hat man keinen Einfluß mehr.

shmia 18. Feb 2008 09:37

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
 
Wenn man die ganze Rechenleistung des Prozess darauf konzentriert, das Formular zu zeichen, sollte das doch machbar sein:
Delphi-Quellcode:
Procedure ProcessPaintMessages;
Var
   Msg : TMsg;
Begin
   // nur Paint-Message verarbeiten
   While PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) Do
   Begin
      DispatchMessage(Msg);
   End;
End;

FormAufnahme.visible := TRUE; // Bild an
ProcessPaintMessages;
.
SendMessage(FCapHandle, WM_CAP_GRAB_FRAME_NOSTOP, 1, 0); // Foto machen
.
FormAufnahme.visible := FALSE; // Bild aus


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