OnMouseMove starten bzw. stoppen
-
torstenschw schrieb:
Hallo,
leider habe ich zu meinem Problem keinen entsprechenden Forumbeitrag gefunden, also poste ich es hier mal:
Ich habe ein Programm zum Ansteueren einer CCD-Zeile (Auslesen und Anzeigen des Spektrums). Bei bestimmten Funktionen möchte ich, dass nach Aufnahme des Spektrums (wird dann auf dem Monitor angezeigt) beim Überfahren der Maus über dem Spektrum die Intensitätswerte des Pixels, bei dem sich die Maus gerade befindet, angezeigt wird. Dazu habe ich bis jetzt OnMouseMove() verwendet und die über GetCursorPos() die entsprechenden Koordinaten eingelesen. Das funktioniert auch wunderbar, nur läuft ja OnMouseMove ständig bei der Message WM_MOUSEMOVE. Das will ich aber nicht. Es soll nur dann laufen, wenn ich mit einem bestimmten Programmteil fertig bin. Ich will diese Funktion also irgendwie starten und stoppen können.
if
(...)
Ich hoffe, ich konnte meine Probleme und möglichen Lösungsansätze hinreichend schildern. Wie würdet ihr das machen! Ich wäre sehr dankbar für jeden Tipp.
Dein Problem ist, dass dir offensichtlich die Grundlagen fehlen.
-
Die Abfrage eines Bool-Wertes hatte ich mir auch schon überlegt, ich dachte nur, dass es vielleicht noch anders geht. Aber wie sieht das bei Multithreading aus? Ich arbeite wirkich zeitkritisch und da brauche ich jede Millisekunde. Deswegen mein Anliegen.
Danke für die erste Antwort.
hustbaer schrieb:
Dein Problem ist, dass dir offensichtlich die Grundlagen fehlen.
Solche Antworten helfen mir auch nicht weiter. Kritik verstehe ich ja, aber nicht solche unbegründete. Warum fehlen mir offensichtlich die Grundlagen? Dann würde ich ja nicht mal OnMouseMove() etc. kennen
-
torstenschw schrieb:
Die Abfrage eines Bool-Wertes hatte ich mir auch schon überlegt, ich dachte nur, dass es vielleicht noch anders geht. Aber wie sieht das bei Multithreading aus? Ich arbeite wirkich zeitkritisch und da brauche ich jede Millisekunde. Deswegen mein Anliegen.
Keine Sorge, wenn in OnMouseMove nur der Ausdruck einer if-Abfrage ausgewertet wird (und der nur eine bool-Variable ist), dann sind wir da noch längst nicht im Millisekundenbereich. Du solltest dir da keine Sorgen um die Performance machen. Wichtig ist nur, dass der Bauch der if-Abfrage ausgeklammert wird, wenn er nicht benötigt wird. So sparst du Zeit. Alle anderen Überlegungen führen dich nirgendwo hin.
torstenschw schrieb:
Warum fehlen mir offensichtlich die Grundlagen? Dann würde ich ja nicht mal OnMouseMove() etc. kennen
Also mit Programmier- oder C++-Grundlagen hat OnMouseMove nun wirklich nix zu tun.
Übrigens verstehe ich dein zweites Anliegen noch nicht so ganz. Du sprichst da von Intensitätsverlauf. Du willst also eine Kurve darstellen, die die Intensität des Pixels darstellt (die sich z.B. durch Position der CCD, Aufheizen der Beleuchtung usw. ändern kann)? Und du willst das Aufzeichnen der Kurze beginnen, wenn OnMouseMove ausgeführt wird oder wie? Also ich weiß ja nicht, wie genau deine Anwendung aussehen soll, aber ich würde lieber Kurven für alle Pixel aufnehmen (dann auch gerne in großzügigen Intervallen wie z.B. 100ms) und dann halt die eine darstellen, auf die der Cursor gerade zeigt. So kannst du für einen bestimmten Zeitpunkt sehen, wie sich Pixel 1 und Pixel 5000 verhalten haben. Na ja, ich rate nur. Wie gesagt, keine Ahnung, wie deine Anwendung aussehen soll und wo du damit hinwillst...
-
_matze schrieb:
Übrigens verstehe ich dein zweites Anliegen noch nicht so ganz. Du sprichst da von Intensitätsverlauf. Du willst also eine Kurve darstellen, die die Intensität des Pixels darstellt (die sich z.B. durch Position der CCD, Aufheizen der Beleuchtung usw. ändern kann)? Und du willst das Aufzeichnen der Kurze beginnen, wenn OnMouseMove ausgeführt wird oder wie? Also ich weiß ja nicht, wie genau deine Anwendung aussehen soll, aber ich würde lieber Kurven für alle Pixel aufnehmen (dann auch gerne in großzügigen Intervallen wie z.B. 100ms) und dann halt die eine darstellen, auf die der Cursor gerade zeigt. So kannst du für einen bestimmten Zeitpunkt sehen, wie sich Pixel 1 und Pixel 5000 verhalten haben. Na ja, ich rate nur. Wie gesagt, keine Ahnung, wie deine Anwendung aussehen soll und wo du damit hinwillst...
Das hab ich dann wohl etwas umständlich formuliert. Ich zeichne immer noch das ganze Spektrum (also alle Pixel) und das alle 10ms z.B. (bei 100ms würde die CCD wohl kaputtgehen --> ist keine handelsübliche, sondern für die Forschug
). Und jetzt interessiert mich vielleicht der eine Pixel mehr als der andere (weil dort z.B. die LED am hellsten leuchtet) und justiere meine Apparatur nach diesem Pixel mehr oder weniger. Wobei ich natürlich immer noch das ganze Spektrum im Überblick habe. Ich will da jetzt die Daten des einen Pixels nicht aufzeichnen lassen, nur dessen Intensität als String fortlaufend ausgeben lassen. Und meistens bewege ich ja dann meine Maus auch nicht mehr, sodass OnMouseMove eher fehl am Platz ist, und eine einfache Abfrage der Cursor-Position nach jeder Messung wohl sinnvoller.
-
Ich glaube einfach man kann aus deinem Beitrag gut erkennen dass dir noch einige Grundlagen fehlen. Und programmieren mit Threads ist auch so gar nicht einfach, von daher... aber egal, wie du schon sagtest - das bringt dich auch nicht weiter.
Aber wie sieht das bei Multithreading aus? Ich arbeite wirkich zeitkritisch und da brauche ich jede Millisekunde. Deswegen mein Anliegen.
Du kannst mit mehreren Puffern arbeiten.
Dadurch kann der Data-Acquisition-Thread immer "seinen" Puffer befüllen, ohne auf irgendwen warten zu müssen.
Wenn er fertig ist, schreibt er den Zeiger auf den Puffer in eine gemeinsame Datenstruktur, damit der GUI Thread sich den Puffer holen kann, und besorgt sich einen neuen Puffer aus dem Pool.
Falls zu dem Zeitpunkt schon ein Puffer in der gemeinsamen Datenstruktur eingetragen ist, wird dieser in den Pool zurückgegeben, und dann mit dem neuen überschrieben.Der GUI Thread könnte dann z.B. periodisch nachsehen ob es neue Daten gibt (ob in der gemeinsam genutzten Datenstruktur ein Zeiger auf einen "neuen" Puffer vermerkt ist). Wenn ja holt er sich diesen, und zeichnet ihn. Und hebt ihn sich auf, bis zum nächsten neuen Puffer, damit er immer was zum Nachschlagen der Intensität hat. Wenn er einen neuen Puffer bekommen hat, gibt er den alten wieder zurück in den Pool.
Die Zugriffe auf die gemeinsam genutzte Datenstruktur musst du dabei natürlich synchronisieren, hier biete sich eine CCriticalSection an. Da diese Zugriffe immer sehr kurz sind, bremst das dein Programm nicht aus.
-
Ich werde die Vorschläge mal nächste Woche versuchen. Was ich mir noch überlegt hatte, einfach die OnMouseMove zu deaktivieren, wenn ich sie nicht brauche, und dann irgendwann wieder aktivieren, aber wie mach ich das ? Die Funktion wird ja automatisch bei der Message WM_MOUSEMOVE aufgerufen. Ich will ja die Mausbewegung an sich nicht stoppen, sondern nur den Aufruf der Funktion bzw. die Weitergabe der Message an den jeweiligen Prozess, der die Funktion aufruft.
-
torstenschw schrieb:
Was ich mir noch überlegt hatte, einfach die OnMouseMove zu deaktivieren, wenn ich sie nicht brauche, und dann irgendwann wieder aktivieren, aber wie mach ich das ?
Was genau erhoffst du dir davon? Ich hatte ja schon mal was dazu gesagt. Das würde dir zeitlich keinen spürbaren Vorteil bringen. Abgesehen davon kannst du das sicher nicht einfach so abstellen.
-
torstenschw schrieb:
Was ich mir noch überlegt hatte, einfach die OnMouseMove zu deaktivieren, wenn ich sie nicht brauche, und dann irgendwann wieder aktivieren, aber wie mach ich das ?
Garnicht.
Die Funktion wird ja automatisch bei der Message WM_MOUSEMOVE aufgerufen. Ich will ja die Mausbewegung an sich nicht stoppen, sondern nur den Aufruf der Funktion bzw. die Weitergabe der Message an den jeweiligen Prozess, der die Funktion aufruft.
Den Aufruf von OnMouseMove kannst du nicht stoppen, das ist per override fix verdrahtet.
Ob man Windows schnell mal eben dazu bringen kann keine WM_MOUSEMOVE mehr zu schicken ... pfuh. Denke es müsste gehen, nur bringt es dir nix.Stell die Priorität vom Data-Acquisition-Thread rauf (+1, +2 - sowas in der Richung), und lass den GUI Thread machen wozu er meint lustig zu sein.
-
torstenschw schrieb:
Ich zeichne immer noch das ganze Spektrum (also alle Pixel) und das alle 10ms z.B. (bei 100ms würde die CCD wohl kaputtgehen --> ist keine handelsübliche, sondern für die Forschug
).
Also, erzähl mir da bloß keinen Quatsch...
Was soll denn eine Spektrum-Darstellung in einem Windows-Fenster mit der möglichen Zerstörung einer CCD-Kamera zu tun haben?Benutzt Dein Programm einen Timer?
Denn 10ms sind für Windows im Rahmen einer GUI-Ausgabe in meinen Augen durchaus als kritisch einzustufenApropos Begriff "Spektrum": Machst Du da eine echte Spektrum-Analyse der Bilddaten?
Oder meinst Du schlicht und einfach die ganz normale Darstellung der Pixeldaten welche von der CCD-Kamera geliefert werden?torstenschw schrieb:
Was ich mir noch überlegt hatte, einfach die OnMouseMove zu deaktivieren, wenn ich sie nicht brauche, und dann irgendwann wieder aktivieren, aber wie mach ich das ?
Mach das mit einer simplen if-Abfrage!
Alles andere ist unnötig kompliziert und vor allem fehleranfällig.Martin
-
Mmacher schrieb:
Also, erzähl mir da bloß keinen Quatsch...
Was soll denn eine Spektrum-Darstellung in einem Windows-Fenster mit der möglichen Zerstörung einer CCD-Kamera zu tun haben?Natürlich hat das gar nichts miteinander zu tun, aber wenn ich die CCD ewig lang (mehrere 100ms) mit einem intensivem Licht z.B. einer LED belichten lasse, dann können da schon ein paar Pixel verloren gehen. Das ist mehr physikalisch
Mmacher schrieb:
Apropos Begriff "Spektrum": Machst Du da eine echte Spektrum-Analyse der Bilddaten?
Oder meinst Du schlicht und einfach die ganz normale Darstellung der Pixeldaten welche von der CCD-Kamera geliefert werden?Ich meine die normale Darstellung der Pixeldaten (Intensitätswerte), dabei handelt sich nicht um RGB-Werte, sondern um reine Intensitätswerte, also wieviel Elektronen wurden ungefähr erzeugt durch die einfallenden Photonen.
Dann danke für die hilfreichen Antworten. Werde vielleicht nicht OnMouseMove() nehmen, sondern die Aktion ausführen, wenn die rechte Maustaste gedrückt wird, ist wohl einfacher.