Windows - Bei jedem Bildrendern eine Funktion ausführen?
-
Ich habe folgendes Problem: ich habe ein Programm X, bei dem ein Ablauf einer Bewegungssequenz von 3D-Modellen in einem Fenster angezeigt wird. Dieses Fenster läuft in einer UNIX-Simulationsumgebung. Ich benötige für ein Projekt die Einzelbilder solch eines Ablaufes.
Die API des Programmes bietet keine Möglichkeit dazu, da habe ich schon alles abgegrast.Nun daher meine Frage, ob es unter windows möglich ist, irgendwie bei jedem Rendern des Hauptbildschirms - oder sagen wir alle X Sekunden (vom User angebbar) eine Funktion auszuführen , und alles andere (es sind viele Prozesse des Programms beteiligt) einzufrieren, bis die Funktion fertig ausgeführt ist (hier wäre es, einen Screenshot zu machen)? Das würde meine Arbeit enorm erleichtern, ich habe noch einen anderen Ansatz, der aber viele Arbeitsstunden mehr kosten würde.
Ich bin für jeden Tip dankbar!
noch ein Nachtrag, ich bin neu im Bereich C++. Ich habe zwar programmiererfahrung in java, vb.net, assembler und diversen Skriptsprachen - aber C++ beginne ich gerade erst. Bitte berücksichtigt dies bei Fachausdrücken, das erleichtert es mir etwas
-
Um eine Aktion "alle x ms" auszuführen, gibt es Timer.
http://www.se.fh-heilbronn.de/usefulstuff/VCPLUS6/kap04.htmFür Screenshots habe ich schon Tutorials gesehen, spätestens mit Google oder auf www.codeproject.com solltest du fündig werden.
Nur ob man das andere Programm "einfrieren" kann, das bezweifle ich.
-
Hm naja du kannst dir nen Handle vom Desktop holen und so an den Screenshot rankommen, aber alle Anwendungen mal eben anhalten das bezweifel ichm wäre ja eigentlich auch nicht nötig.
Deine Anwendung selbst könnten einen Timer benutzen, oder wenn das zu langsam ist halt einen Workthread mit Sleep der die Screenshots macht. Obwohl ich denke Timer reicht, du musst eh einplanen, dass das Speichern der Bilder ein paar Millisekunden einnimmt.
-
Okay, soweit so gut. Mein Ansatz, die Anwendungen anzuhalten war davon ausgelöst, dass ich ja irgendwie die Anwendung synchronisieren muss:
Wenn ich einen Screenshot mache, dann benötigt der, wie ja eben genannt, einige ms um die Datei zu speichern. Ich will ja aber jedes Einzelbild erwischen - daher wollte ich die Anwendung irgendwie anhalten.
das Problem ist ja, was passiert wenn aus irgendeinem Grund das Speichern der Datei mal länger dauert?
Ich möchte aus den Einzelbildern später ein Video erstellen.
Ich will nun also ein Video mit sagen wir 25 fps machen.
D.h. dann, ich muss alle 40 ms einen Screenshot schiessen.
Wenn das Speichern nun aus irgendeinem Grund mal länger als 40 ms dauert (was doch nicht unbedingt unwahrscheinlich ist), was dann? Dann geht mir ja mindestens ein Bild verloren, bzw. die Synchronisation mit dem Ablauf der Bewegungssequenz ist dahin. Oder denke ich jetzt in die falsche Richtung?
-
hm ich glaub der Timer liegt bei 50 ms was er nach unten maximal mitmacht. Das wird eng. Dazu kommt das ein Timer eine geringe priorität hat. Da wäre ein Worker-Thread mit Sleep bestimmt besser.
Anwendung anhalten geht nicht. Du könntest nur deine eigene priorität hochstellen um so evtl ne Verzögerung rauszuholen, aber das ist dann eher jetzt Spekulation.Du könntest dir nen Bilderpuffer einrichten, damit das Speichern das ganze nocht so ins stocken gerät. Also ingesamt wird das ganze recht aufwendig.
-
Wie siehts aus, wenn ich einen "Main"-Worker-Thread mache, der alle X ms einen weiteren Thread startet, der wiederum das Bild speichert? Würde der Main-Worker-Thread dann nicht ungeachtet dessen, ob der "unter"-Thread das Bild fertig gespeichert hat, weitermachen (und den nächsten Thread starten)?
Ich hoffe das war verständlich..
Ich frage, weil mir die Erfahrung mit Threads unter Windows fehlt. Nach meinem Verständnis würden evtl. wenn das Speichern ins stocken gerät zwar vielleicht 3 oder mehrere "Unter"-Threads, also vom Mainthread gestartete Threads existieren, aber das Bild läge ja recht schnell nach Starten des jeweiligen Unterthreads im Speicher - die langwierigere Prozess wäre doch das auf Platte bannen, ist das so richtig?
-
Ich denke das würde gehen. Du tust für jedes Bild speichern einen Thread starten. Die wären dann unabhängig voneinander. Hm aber ob das dann wirklich synchron rauskommt bewzeifel ich, zumindest nicht millisekunden genau.
Du müsstest deinen Hauptthread in einer Schleife laufen lassen. Mit Sleep wartet er immer die 40 ms, dann liest du den aktuellen Desktop aus noch im Hauptthread. Die Bilddaten übergibst du an einen neuen Thread der die Daten auf Festplatte bannt.
Klingt erstmal logisch, musst du halt testen ob das genügt.
Ansonsten weis ich jetzt nicht ob es evtl sogar sind macht einen Hook einzurichten, der weiter "oben" in Windows die Nachrichten auf Paint-Routinen durchsucht.
-
Zu Threads findest du in der entsprechenden Kategorie in der FAQ eine Anleitung.
-
ja, einen thread habe ich bereits für eine andere sache in dem projekt erstellt. danke soweit - mal schauen, ich verfolge gerade noch einen anderen ansatz..
-
sag uns bescheid, wenn du ihn gefangen hast