Programm funktioniert nicht richtig.
-
B.B. schrieb:
Diese ständige Abfrage der Maus ( Polling ) ist nicht so gut, weil es wertvolle Prozessorzeit in Anspruch nimmt.
es kommt drauf an. wenn der prozessor sonst nix zu tun hat, ist das in ordnung. bis vielleicht auf einen leicht erhöhten energieverbrauch (bei manchen systemen).
-
fricky schrieb:
B.B. schrieb:
Diese ständige Abfrage der Maus ( Polling ) ist nicht so gut, weil es wertvolle Prozessorzeit in Anspruch nimmt.
es kommt drauf an. wenn der prozessor sonst nix zu tun hat, ist das in ordnung. bis vielleicht auf einen leicht erhöhten energieverbrauch (bei manchen systemen).
Klar. Der Prozessor hat ja auch nichts weiter zu tun, als sich mit meiner 'where mouse main' zu befassen.
-
keine panik
Sleep(100);
und es ist ok
-
B.B. schrieb:
Klar. Der Prozessor hat ja auch nichts weiter zu tun, als sich mit meiner 'where mouse main' zu befassen.
wie gesagt: es kommt drauf an...
-
BorisDieKlinge schrieb:
keine panik
Sleep(100);
und es ist ok
Ist auch nicht zu empfehlen. Findet in dieser Pause ein Klick statt, kann nach Sleep der Mauszeiger ganz woanders sein und man bekommt falsche Ergebnsisse.
-
oh man..
while(1) { if(GetAsyncKeyState(VK_RBUTTON)){ // do bullshit } else sleep(100); }
-
Sleep(1) reicht völlig aus.
-
BorisDieKlinge schrieb:
oh man..
while(1) { if(GetAsyncKeyState(VK_RBUTTON)){ // do bullshit } else sleep(100); }
Meinst du etwa, das im else Zweig kein Klick stattfinden kann ?
Oh Frau..
-
schlafwissenschaftler schrieb:
Sleep(1) reicht völlig aus.
Sleep(0) ist besser. das gibt einfach nur die angefangene zeitscheibe sofort ab, ohne den thread für einen systemtick schlafen zu legen.
-
fricky schrieb:
schlafwissenschaftler schrieb:
Sleep(1) reicht völlig aus.
Sleep(0) ist besser. das gibt einfach nur die angefangene zeitscheibe sofort ab, ohne den thread für einen systemtick schlafen zu legen.
Noch besser ist, Sleep(-1). Dann werden die Mausklicks vorhergesagt.
-
Zukunftsvisionär schrieb:
Noch besser ist, Sleep(-1). Dann werden die Mausklicks vorhergesagt.
was aber egal ist, weil sämtliche mausklicks bei 'Sleep(-1)' das programm nicht interessieren werden.
-
B.B. schrieb:
Meinst du etwa, das im else Zweig kein Klick stattfinden kann ?
Oh Frau..spielt keine rolle, wo sich die mauss nacher befindet, er will nur die richtung "WÄHREND" des gedrückhalten wissen nich den weg o. positipon
-
schlafwissenschaftler schrieb:
Sleep(1) reicht völlig aus.
Womit wir wieder beim Polling-Problem wären.
-
Nagut, auf die Probleme bezüglich Polling und Sleep ist ja der OP hingewiesen worden. Sich für eine Variante zu entscheiden liegt bei ihm.
Zum Problem selbst:
Verzichte auf float, fabs und co.
Die Bildschirmkoordinaten sind long Werte.
Du brauchst eine zweite Variable vom Typ POINT, um die Koordinatendifferenzen bilden zu können:#include <stdio.h> #include <windows.h> #define PFUI_1 1 #define PFUI_2 100 int main() { POINT now, before; long dx, dy; GetCursorPos( &before ); while ( PFUI_1 ) { Sleep ( PFUI_2 ); while ( GetAsyncKeyState( VK_RBUTTON ) ) { GetCursorPos( &now ); dx = now.x - before.x; dy = now.y - before.y; if ( dy > 0 && dx > 0 ) printf( "3\r" ); if ( dy < 0 && dx > 0 ) printf( "9\r" ); if ( dy > 0 && dx < 0 ) printf( "1\r" ); if ( dy < 0 && dx < 0 ) printf( "7\r" ); if ( dx > 0 && dy == 0 ) printf ( "6\r" ); if ( dx < 0 && dy == 0 ) printf ( "4 \r" ); if ( dy > 0 && dx == 0 ) printf ( "2\r" ); if ( dy < 0 && dx == 0 ) printf ( "8\r" ); before = now; } } return 0; }
-
Woar, herzlichen dank B.B.
Ich habe es einbisschen verändert. Wenn man die Maus nach oben links so in das Gebiet lenkt, passiert nichts ( 4 - 7 - 8 ). Weiß wer warum?
#include <stdio.h> #include <windows.h> #define WARTE 1000 int main() { POINT now, before; long dx, dy; long dif = 10; GetCursorPos( &before ); while ( 1 ) { Sleep ( WARTE ); while ( GetAsyncKeyState( VK_RBUTTON ) ) { GetCursorPos( &now ); dx = now.x - before.x; dy = now.y - before.y; if(dx>dif || dy>dif) { if ( dy > 0 && dx > 0 ) printf( "3" ); if ( dy < 0 && dx > 0 ) printf( "9" ); if ( dy > 0 && dx < 0 ) printf( "1" ); if ( dy < dif && dx < dif ) printf( "7" ); if ( dx > 0 && dy == 0 ) printf ( "6" ); if ( dx < 0 && dy == 0 ) printf ( "4" ); if ( dy > 0 && dx == 0 ) printf ( "2" ); if ( dy < 0 && dx == 0 ) printf ( "8" ); before = now; } } printf("\n"); now.x = 0; now.y = 0; before.x = 0; before.y = 0; dx = 0; dy = 0; } return 0; }
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Vielleicht hat es mit dem treiber zu tun?
-
Keiner eine idee?