Toon posts:

[C++][Win32] Threads of iets anders?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met een klein spelletje, ik maak gebruik van de Win32 API. Nu heb ik het probleem dat mijn programma op 50% CPU draait. Volgende message-loop:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    bool bDone = false;
    while(!bDone)
    {
        if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
        {
            if(Msg.message == WM_QUIT)
            {
                bDone = true;
            }
            else
            {
                TranslateMessage(&Msg);
                DispatchMessage(&Msg);
            }
        }
        else
        { // Alles wat niet met window te maken heeft wordt hier afgehandeld }
       }


Hoe kan ik er voor zorgen dat mijn programma niet meer op 100% CPU gaat draaien? Ik had wel eens wat gehoord over threads, nu heb ik wat geprutst maar ik kwam er niet helemaal uit. Is er ook nog een andere manier om er voor te zorgen dat hij niet zoveel CPU in beslag neemt? Of zal ik threads moeten gebruiken?

Mvg. Peter

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Je probleem zit inderdaad in deze loop - waar heb je die vandaan? PeekMessage retourneert onmiddelijk, ook als je niets te doen hebt. Gevolg: 50% CPU doordat je telkens test of PeekMessage wel iets teruggeeft.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • writser
  • Registratie: Mei 2000
  • Laatst online: 10-02 20:24
Sleep statementje in je loop plakken?

Onvoorstelbaar!


  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 10-10-2025
Probeer dit eens
code:
1
2
3
4
5
6
7
8
9
10
11
12
    bool bDone = false;
    while(!bDone)
    {
        if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
        {
            //snip
        }
        else
        { // Alles wat niet met window te maken heeft wordt hier afgehandeld 
        }
        Sleep(1); //slaap 1 milliseconde om ervoor te zorgen dat andere threads aan de beurd komen.
       }

ps. je moet even een werkende sleep vinden, hij legt ook je programma 1 ms stil, mischien is dat al te lang.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Met andere woorden, je kunt beter GetMessage gebruiken. GetMessage wacht gewoon net zo lang tot er een message binnenkomt, en gebruikt daarbij bijna geen CPU.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Korben schreef op donderdag 05 oktober 2006 @ 21:20:
Met andere woorden, je kunt beter GetMessage gebruiken. GetMessage wacht gewoon net zo lang tot er een message binnenkomt, en gebruikt daarbij bijna geen CPU.
Wat in een game weer geen nut heeft, omdat je ook dingen wilt verwerken zonder dat je berichtjes krijgt.

Wat een oplossing is is timer messages te schedulen (SetTimer()), zodat je eens in de zoveel tijd een WM_TIMER message krijgt. Een andere manier is om idd Sleep() te gebruiken, maar dan zou ik niet zomaar een Sleep(1) in je code zetten, maar gewoon meten hoeveel tijd je verbruikt hebt en als dat minder is dan een bepaalde thresshold de rest "opmaken" door te wachten. MsgWaitForSingleObject is hier een handige functie voor, aangezien je daarmee kunt wachten op een message tot een bepaalde timeout verstreken is (is er een bericht, verwerk die dan, en als de timeout verstreken is verwerk je weer nog een lus in de gameloop)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 09:03
barfieldmv schreef op donderdag 05 oktober 2006 @ 21:11:
ps. je moet even een werkende sleep vinden, hij legt ook je programma 1 ms stil, mischien is dat al te lang.
Reken er maar op dat dat er meer worden dan 1

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Bedankt voor de reacties! Ik heb het werkend gekregen met SetTimer :).

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
.oisyn schreef op donderdag 05 oktober 2006 @ 22:09:
[...]
[GetMessage]
Wat in een game weer geen nut heeft, omdat je ook dingen wilt verwerken zonder dat je berichtjes krijgt.
Die dingen doe je dan weer wel in een thread, en warschijnlijk via een WaitForMultipleEvents?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, je gameloop wil je niet in een andere thread dan je message thread - moet je je input weer synchroniseren tussen die threads enzo.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
In dat geval heb je nog steeds MsgWaitForSingleObject als optie.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1