AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildschirmaufbau abgeschlossen - wie kann man das ermitteln

Bildschirmaufbau abgeschlossen - wie kann man das ermitteln

Offene Frage von "JensHeinrichs"
Ein Thema von JensHeinrichs · begonnen am 17. Feb 2008 · letzter Beitrag vom 18. Feb 2008
Antwort Antwort
JensHeinrichs

Registriert seit: 4. Jan 2005
Ort: Bad Schwartau
11 Beiträge
 
#1

Bildschirmaufbau abgeschlossen - wie kann man das ermitteln

  Alt 17. Feb 2008, 20:37
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
Jens Heinrichs
  Mit Zitat antworten Zitat
Masteric

Registriert seit: 1. Aug 2007
Ort: Melsungen
155 Beiträge
 
Delphi 7 Professional
 
#2

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt

  Alt 17. Feb 2008, 22:00
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
"Programmieren ist eine der universellsten, allübergreifendsten und höchsten von Menschen erreichten Formen der Kreativität."
Nur weil Gott die Welt in 6 Tagen erschaffen hat, heisst das nicht, dass Informatiker alles in 6 Tagen programmieren können.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt

  Alt 17. Feb 2008, 23:08
statt Sleep verwende Application.ProcessMessages.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt

  Alt 18. Feb 2008, 00:52
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.026 Beiträge
 
Delphi XE3 Enterprise
 
#5

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt

  Alt 18. Feb 2008, 09:09
Deutlichen Rückgang der CPU Leistungsanforderung Deines Programms abwarten.... // Grüße // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
JensHeinrichs

Registriert seit: 4. Jan 2005
Ort: Bad Schwartau
11 Beiträge
 
#6

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt

  Alt 18. Feb 2008, 09:22
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.
Jens Heinrichs
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt

  Alt 18. Feb 2008, 09:37
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
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf