![]() |
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 |
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 |
Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
statt Sleep verwende Application.ProcessMessages.
|
Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
Zitat:
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 |
Re: Bildschirmaufbau abgeschlossen - wie kann man das ermitt
Deutlichen Rückgang der CPU Leistungsanforderung Deines Programms abwarten.... // Grüße // Martin
|
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. |
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 02:31 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