Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Programm stockt bei Tastatureingabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.02.2010, 13:22 Uhr
Moritz1243



Hallo zusammen,

ich habe ein problem mit der Tastatureingabe im meinem Opengl Programm und zwar habe ich in meinem Programm eine Pause von 10ms eingebaut(Sleep(10)) um die CPU last gering zu halten. Das Problem welches dadurch entsteht ist das, wenn man einen taste länger gedrückt hält beginnt das Programm zu stocken und geht von 60FPS auf 30FPS runter. Lässt man die pause weg beginnt das Programm nicht zu stocken wen man eine Taste länger drückt. Kann es sein das während meiner Pause im Programm der Tasturbuffer immer voller wird - wenn ja kann man diesen irgendwie leeren. Oder kann es sein das man die Tasten erst irgendwie registieren muss oder so?

bitte bedenkt ich bin noch ein Anfänger

grüße Moritz

hier ist der Sourcecode bei dem das Problem auftritt www.c-plusplus.de/forum/viewtopic-var-t-is-261620.html
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.02.2010, 18:33 Uhr
Hans
Library Walker
(Operator)


Hi,

bin mir jetzt nicht ganz sicher, aber ich glaube mit Sleep bewirkst Du das Gegenteil von dem was Du bezwecken willst, weil Sleep für die angegebene Zeit die CPU blockiert. Genaueres zur Wirkungsweise von Sleep findest Du hier.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.02.2010, 19:51 Uhr
TOSHMAX



Nachrichten, wie z. B. WM_KEYDOWN, WM_SIZE, ..., werden bei Windows in eine Art Warteschlange gesteckt. Mit Peekmessage holst du dir die nächste wartende Nachricht aus dieser Schlange heraus.

Dort, wo du Sleep benutzt, bewirkt es allerdings, dass nicht nur dem Zeichnen, sondern auch nach einer Verarbeitung von Nachrichten gewartet wird.

Wenn du also lange auf einer Taste bleibst, werden sehr viele Nachrichten geschickt. Und nach jeder verarbeiteten Nachricht wartet es einige Milliisekunden und zeichnet währenddessen auch nicht.

Falls du Sleep also wirklich benutzen willst, solltest du es nach SwapBuffers aufrufen, damit wirklich nur nach einem Zeichengang kurz gewartet wird!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.02.2010, 22:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


den unteren teil würde ich so modifizieren:

C++:

while(!done)                                    // Loop That Runs While done=FALSE
    {
        while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))    // Is There A Message Waiting?
        {
            if (msg.message==WM_QUIT)                // Have We Received A Quit Message?
            {
                done=TRUE;                            // If So done=TRUE
            }
            else                                    // If Not, Deal With Window Messages
            {
                TranslateMessage(&msg);                // Translate The Message
                DispatchMessage(&msg);                // Dispatch The Message
            }
        }

            // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
            if (active)                                // Program Active?
            {
                if (keys[VK_ESCAPE])                // Was ESC Pressed?
                {
                    done=TRUE;                        // ESC Signalled A Quit
                }
                else                                // Not Time To Quit, Update Screen
                {
                    DrawGLScene();                    // Draw The Scene
                    SwapBuffers(hDC);                // Swap Buffers (Double Buffering)
                }
            }

            if (keys[VK_F1])                        // Is F1 Being Pressed?
            {
                keys[VK_F1]=FALSE;                    // If So Make Key FALSE
                KillGLWindow();                        // Kill Our Current Window
                fullscreen=!fullscreen;                // Toggle Fullscreen / Windowed Mode
                // Recreate Our OpenGL Window
                if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
                {
                    return 0;                        // Quit If Window Was Not Created
                }
            }

       Sleep(10);
    }



dann behandelt er alle nachrichten, zeichnet dann und wartet erst danach
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.02.2010, 18:18 Uhr
Moritz1243



Hi,

vielen dank, dass ihr euch mein Problem angeschaut habt. Das Programm funktioniert jetzt wie gewollt . Du hast ja geschrieben"wenn ich das wirklich mit Sleep machen will" - wie würdest du denn so eine Pause machen?

Grüße Moritz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.02.2010, 10:34 Uhr
TOSHMAX



Ich glaube OpenGL hat bei den Standard Einstellungen sowieso 60 FPS als Maximum.
Ich bin mir nicht sicher, aber ich glaube Sleep bringt in diesem Fall keine Einsparung der CPU Leistung, da es trotzdem 60 FPS bleiben.

Aber wie gesagt, ich bin mir nicht ganz sicher. Du könntest es probieren, aber wenn es jetzt läuft, kannst du es auch so lassen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.02.2010, 13:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von TOSHMAX:
Ich glaube OpenGL hat bei den Standard Einstellungen sowieso 60 FPS als Maximum.
Ich bin mir nicht sicher, aber ich glaube Sleep bringt in diesem Fall keine Einsparung der CPU Leistung, da es trotzdem 60 FPS bleiben.

Aber wie gesagt, ich bin mir nicht ganz sicher. Du könntest es probieren, aber wenn es jetzt läuft, kannst du es auch so lassen!

das nennt man vertical sync (vsync) kann man unter Windows mit glSwapInterval ein und ausschalten. und 60fps weil dein Bildschirm 60Hz hat, hättest du einen 100hz bildschirm, wären das 100fps.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.02.2010, 17:34 Uhr
Moritz1243




Zitat von FloSoft:

Zitat:
Ich glaube OpenGL hat bei den Standard Einstellungen sowieso 60 FPS als Maximum.
Ich bin mir nicht sicher, aber ich glaube Sleep bringt in diesem Fall keine Einsparung der CPU Leistung, da es trotzdem 60 FPS bleiben.

Aber wie gesagt, ich bin mir nicht ganz sicher. Du könntest es probieren, aber wenn es jetzt läuft, kannst du es auch so lassen!

das nennt man vertical sync (vsync) kann man unter Windows mit glSwapInterval ein und ausschalten. und 60fps weil dein Bildschirm 60Hz hat, hättest du einen 100hz bildschirm, wären das 100fps.


Hallo,

danke für die antwort, aber würde ich mit vsnc nicht einfach nur die fequenz des bufferwechslns verändern und das programm würde weiterhin so schnell laufen? @TOSHMAX
durch die Pause wird die CPU last 1-3% also sehr gering.

grüße Moritz.

Dieser Post wurde am 27.02.2010 um 18:35 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: