OnMouseMove MouseMove
-
Ich hab ähnliche Probleme mit dem MouseMoveEvent, das feuert bei einer Komponente auch ständig. Ich hab´s dadurch gelöst, dass ich mir die Mauskoordinaten lokal merke und nur bei echten Änderungen auf das Event reagiere:
void __fastcall MyForm::OnMouseMove( TObject* Sender, MouseButton Button, TShiftState Shift, int X, int Y ) { static TPoint last = TPoint( -1,-1 ); TPoint curr = TPoint( X, Y ); if( curr != last ) { last = curr; // tu was } }
-
-
@hustbaer sagte in OnMouseMove MouseMove:
@DocShoe sagte in OnMouseMove MouseMove:
static TPoint last = TPoint( -1,-1 );
*Schmerzen*
Alternative?
-
Membervariable?
-
Dann schlepp ich das ja da mit, wo ich es überhaupt nicht brauche. Mit meiner Lösung ist der "Schaden" auf die einzige Funktion begrenzt, wo er gebraucht wird. Race conditions können nicht auftreten, da der Aufruf immer aus dem GUI Thread kommt, ich sehe also nix, was dagegen spricht. Außer persönlicher Präferenz.
-
Was hältst du denn von solchen Konstrukten?
void f() { static bool PreventReentrance = false; if( !PreventReentrance ) { PreventReentrance = true; ... PreventReentrance = false; } }
-
Ist das nicht eine Race Condition, die nur darauf wartet, dass sie explodiert?
-
Jo, denke auch. Hab sowas mal in ´nem Snippet gesehen, hängt vermutlich vom Einsatzbereich ab, wo das eingesetzt wird.
-
@DocShoe sagte in OnMouseMove MouseMove:
Jo, denke auch. Hab sowas mal in ´nem Snippet gesehen, hängt vermutlich vom Einsatzbereich ab, wo das eingesetzt wird.
Nein, das ist einfach immer falsch, aber viele Leute haben halt einfach kein Bewusstsein für Race Conditions. Fehler dieser Art wirst du tausendfach in Codebeispielen finden, besonders oft sieht man dies bei Dateihandling.
-
Du gehst von Multithreading aus, das kann man auch zum Verhindern von endloser Rekursion benutzen. Wenn man seinen Programmablauf nicht im Griff hat.
-
@DocShoe sagte in OnMouseMove MouseMove:
Du gehst von Multithreading aus, das kann man auch zum Verhindern von endloser Rekursion benutzen. Wenn man seinen Programmablauf nicht im Griff hat.
Naja, der gezeigte Code ist ganz eindeutig auf Multithreading bezogen, wo er falsch ist. Ansonsten bist du bei "Leute benutzen if mit globalen Variablen", was natürlich auch oft richtig eingesetzt wird
-
Ich weiß zufällig, dass er nicht in Multithreading eingesetzt wird
-
@DocShoe sagte in OnMouseMove MouseMove:
Ich weiß zufällig, dass er nicht in Multithreading eingesetzt wird
Häh? Wieso dann Reentrance (falsch) verhindern?
das kann man auch zum Verhindern von endloser Rekursion benutzen
Beziehst du dich darauf? Nutzt hier jemand statische Variablen in einer Rekursion? Das spricht ja noch mehr dafür, dass viele Leute einfach keine Ahnung haben.
-
Jetzt muss ich aufpassen, was ich sage. Da könnte jemand sauer auf mich werden. Aber ja, damit wird Rekursion verhindert.
-
Dieser Beitrag wurde gelöscht!
-
@DocShoe sagte in OnMouseMove MouseMove:
Dann schlepp ich das ja da mit, wo ich es überhaupt nicht brauche. Mit meiner Lösung ist der "Schaden" auf die einzige Funktion begrenzt, wo er gebraucht wird. Race conditions können nicht auftreten, da der Aufruf immer aus dem GUI Thread kommt, ich sehe also nix, was dagegen spricht. Außer persönlicher Präferenz.
Mir ging's weniger um Race-Conditions sondern darum dass das u.U. nimmer so wie es soll funktioniert wenn's mal zwei oder mehr Instanzen von dem Fenster gibt.
-
@DocShoe sagte in OnMouseMove MouseMove:
Was hältst du denn von solchen Konstrukten?
void f() { static bool PreventReentrance = false; if( !PreventReentrance ) { PreventReentrance = true; ... PreventReentrance = false; } }
Auch *Schmerzen*
Mitthread_local
und RAII wäre es OK.
-
@SeppJ sagte in OnMouseMove MouseMove:
@DocShoe sagte in OnMouseMove MouseMove:
Du gehst von Multithreading aus, das kann man auch zum Verhindern von endloser Rekursion benutzen. Wenn man seinen Programmablauf nicht im Griff hat.
Naja, der gezeigte Code ist ganz eindeutig auf Multithreading bezogen, wo er falsch ist. Ansonsten bist du bei "Leute benutzen if mit globalen Variablen", was natürlich auch oft richtig eingesetzt wird
Ich kenn solchen Code eher dafür Rekursion zu vermeiden.
Wobei ich die Variable dann nichtPreventReentrance
sondernIsRecursiveCall
oder so nennen würde.
-
@Th69 Ich habe das Problem anders gelöst. Das verschieben des TButton auf dem Formular löst immer wieder MouseMove aus... ich verschiebe jetzt ein TBitBtn damit geht es.
Danke für eure ganzen Antworten
Gruß Ska