Laden...

Maus bewegung sehr langsam...

Erstellt von -Hades- vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.042 Views
-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren
Maus bewegung sehr langsam...

Hallo,

ich bin dabei eine kleine Anwendung oder eher ein kleines Spielchen zu schreiben. Zwischendurch muss die Anwendung die Maus willkürlich quer über den Screen fahren lassen.
Das ganze habe ich per Cursor.Position = ...; realisiert. Die Maus bewegt sich auch so wie ich es mir vorstelle, jedoch passiert das ganze extrem langsam. Man könnte dabei einschlafen... Ich habe das ganze vor kurzem bei einem Kollegen ausprobiert der 2 CPU's in seinem Rechner hat, da lief es bedeutend schneller. Ich habe, nebenbei bemerkt, ein Thread.sleep(1) zwischen dem Versetzen der Mausposition um einen Pixel eingebaut, noch weniger geht ja schließlich nicht. Nehme ich das sleep(1) raus passiert alles so schnell, dass man es gar nicht mehr sieht.
Der Cursor scheint eine heiß umkämpfte Resource zu sein und ich befürchte ich werde den Kampf gegen Windows mit den Mitteln die ich benutze immer verlieren.
Daher meine Frage ob jemand eine andere Methode kennt die das gewünschte liefert oder ob ich das ganze beschleunigen kann.

Gruß Hades

3.430 Beiträge seit 2007
vor 15 Jahren

Hallo Hades,

du musst den Pfeil ja nicht nur um einen Pixel verschieben.
Denn wenn du den direkt um 10 oder 20 verschiebst geht es schon viel schneller und es sieht trotzdem noch sehr flüssig aus.

Was verstehst du überhaupt unter ganz langsam? 10-20 sekunden, könnte ich mir da schon vorstellen (für den ganzen Bildschirm).

Denn Windows ist nicht echtzeitfähig.
Deshalb kannst du dir nie ganz sicher sein, dass Thread.Sleep genau eine Millisekunde dauert. AFAIK geht das nur auf eine Genauigkeit von 20ms, dadurch wird den Thread.Sleep oft bis zu 20 ms dauern obwohl du nur eine wolltest.

Gruss
Michael

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

Hallo,

schonmal danke für die Antwort aber das ist nicht ganz das was ich mir als eine Lösung auf mein Problem vorgestellt habe. Man merkt dann doch recht deutlich das die Maus sich nicht wirklich Pixel für Pixel bewegt.

Hat vielleicht noch jemand eine Lösung für das problem? Also ich denke ich bräuchte eine Möglichkeit Windows eine Message zu schicken, die besagt, dass die Maus von Punkt A zu Punkt B bewegt werden soll, und zwar über alle Zwischenstationen...

Gruß Hades

1.130 Beiträge seit 2007
vor 15 Jahren

Nimm einen Multimediatimer und miss die zeit mit ner Stopwatch. Multiplizier die Geschwindigkeit mit der Zeit ,die seit dem letzten Aufruf verstrichen ist, und der Richtung und addier das Ergebnis dann dann zur Mausposition.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

1.665 Beiträge seit 2006
vor 15 Jahren

Ich weiß nicht, ob es hilft. Aber verwende anstatt Thread.Sleep() die umgekehrte Variante mit dem System.Windows.Forms.Timer.

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

Hi,

also deine Lösung klingt nicht schlecht floske.
Warum ein Timer jetzt etwas groß anderes als ein sleep sein soll weiß ich allerdings nicht, könntest du mir vielleicht kurz erklären warum das mein Problem löst?

3.430 Beiträge seit 2007
vor 15 Jahren

Hallo -Hades-

Ich weiß nicht, ob es hilft. Aber verwende anstatt Thread.Sleep() die umgekehrte Variante mit dem System.Windows.Forms.Timer.

Der Timer ruft in einem Intervall eine bestimmte Methode auf.
Das ist die bessere Lösung als das Thread.Sleep zu verwenden, da das Thread.Sleep oft etwas komische Effekte haben kann.

In deinem Fall wirst du da wahrscheinlich keinen Unterschied merken.
Denn beim Thread.Sleep und beim Timer hast du das selbe Problem, dass Windows nicht echtzeitfähig ist und deshalb sieht das nicht sehr flüssig aus.

Hingegen der Lösungsvorschlag von Floste könnte das Problem wirklich lösen

Gruss
Michael

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

Vielen dank für eure Antworten.
Also ich werde Floskes Lösung definitiv einbauen, das scheint mir eine sehr vernünftige Lösung. Allerdings habe ich gerade gesehen das es eine CursorSetPos methode in der user32.dll gibt. Hat jemand Erfahrung mit der Methode? Macht die dasselbe oder is diese vielleicht etwas besser geeignet?

2.760 Beiträge seit 2006
vor 15 Jahren

Du könntest um eine realistischere Bewegung zu erhalten auch eine Beschleunigung einbauen.

Nach den ersten X pixeln wird die Maus x 1.1 schneller usw... bis zu einer gewissen Grenze und dann in 0.9 schritten wieder langsamer.
Das schaut schöner aus und ist auch schneller.

CursorSetPos -> MSND, PInvoke.net