|
Hi,
I recently wrote a wrapper class around the WINAPI windowing system. This object creates a thread which calls GetMessage in a loop, as you do when creating a window. However, I soon noticed that as soon as I instantiated one of these windows, my processor meter would skyrocket and my system would slow down. I figured the canvas was the problem.
Just recently, I replaced the first line of my WinMain with "while(1);" and the same thing happens. So my program effectively reads
<br />
int WINAPI WinMain (HINSTANCE hThis, HINSTANCE hPrev, LPSTR lpszArg, int nCShow){<br />
while(1);<br />
return 0;<br />
}<br />
and it needs about 70% of the processor to do it. Can anybody explain what is going on here? Why should the scheduler be giving this process so much CPU time?
Thanks
-Greg
|
|
|
|
|
gpascale wrote: Why should the scheduler be giving this process so much CPU time?
Why shouldn't it? It's not the scheduler's job to say "that's a dumb process". It's the scheduler's job to give you as much time to do silly things in as it can. For all it knows, you're doing some really clever complex protein folding program to save mankind from the perils of cancer.
while (1);
may not cure cancer, but it doesn't go into any wait routines (like WaitForXEvent or GetMessage etc) to signal to the scheduler that you're done for the moment.
When you say you create a thread, do you mean the main thread, or a second one? And does GetMessage block, or fall straight out with an error message?
Iain.
|
|
|
|
|
Right. I get that.
The thing is that I would expect something like GetMessage() to do something more intelligent than spinlock while it waits for a message. Namely, I would expect it to go to sleep and be woken up when a message is sent. If this isn't the case, then how can you write a windowed application without using an absurd amount of CPU?
When I say create a thread, I mean my window class creates a thread whose job is to call GetMessage in a loop, so I can do other things in my main thread.
Thanks,
-Greg
|
|
|
|
|
...or are you using PeekMessage() instead of GetMessage() in your message loop...Bad
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Nope. PeekMessage doesn't block, does it? I definitely want to block.
|
|
|
|
|
Heh. I guess I should have read your actually question....
I'm surprised your while loop only got 70% of the CPU...it
pegs one of my CPUs to nearly 100%
Busy loops are bad in Windows!!!
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
You're a legend
There's a post on the microsoft.public.vc.language from a
Microsoft employee that states there's evidence that you are
a BOT because of the way you post to so many newsgroups
simultaneously.
Next time you're here, we'll throw water on you to see if you short-circuit...
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
|
Hey Johannes,
Long time no see!
It's interesting....the community is still discussing George...
They're starting to convince me he's not real...
The machines....they're taking over...
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
OMG poor toxxct, fighting against the machine!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
!!
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Of course I think he's lucky that toxxct isnt here.
|
|
|
|
|
|
Mark Salsbery wrote: there's evidence that you are
a BOT
I don't believe humans are scientifically advanced enough to create a BOT that is that dense.
led mike
|
|
|
|
|
Wow I saw his questions on the newsgroups(google) and other forums one thing was iinteresting for me I used of google for search about a problem but first link was George_George (of course I respect to George_George ).
|
|
|
|
|
If I have one class derived from another, an overloaded virtual function in the base class, and an implementation of one of the overloaded functions in the derived class, the compiler will only let me call one of the overloaded functions from a pointer/reference of an instance of the derived class. I am confused as why it won't acknowledge the other function. Can anyone help me understand why this is?
class CBaseClass
{
public:
CBaseClass(void) {}
virtual ~CBaseClass(void) {}
virtual void DoSomething(int a) {}
virtual void DoSomething(int a, int b) {}
};
class CDerivedClass : public CBaseClass
{
public:
CDerivedClass(void) {}
virtual ~CDerivedClass(void) {}
virtual void DoSomething(int a) {}
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CDerivedClass testing;
testing.DoSomething(5,5); // Get an error on this line
// error C2660: 'CDerivedClass::DoSomething' : function does not take 2 arguments
}
|
|
|
|
|
You either need to implement a two-argument DoSomething() function, or make testing a CBaseClass object.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Thanks for the advice on how to cope with it. You don't by any chance know what is responsible, topic wise, for this behavior?
Is this because of the concept of "Hiding"? I'm not sure what topic I need to google for to better understand it.
Thanks
|
|
|
|
|
bob16972 wrote: You don't by any chance know what is responsible, topic wise, for this behavior?
CDerivedClass does not have a two-argument DoSomething() method, hence the compiler error.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I guess I'm missing the point. I apologize if I'm missing something right under my nose.
If your saying a derived class needs to implement all the virtual methods that are in the base, then I guess I'm not understanding why this works...
class CBaseClass
{
public:
CBaseClass(void) {}
virtual ~CBaseClass(void) {}
virtual void DoSomething(int a) {}
virtual void DoSomething(int a, int b) {}
};
class CDerivedClass : public CBaseClass
{
public:
CDerivedClass(void) {}
virtual ~CDerivedClass(void) {}
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CDerivedClass testing;
testing.DoSomething(5,5); // Get an error on this line
}
|
|
|
|
|
bob16972 wrote: If your saying a derived class needs to implement all the virtual methods that are in the base,
They don't have to be implemented, but when they are, their types must match.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
BTW, the following is allowed
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CBaseClass *pCDerivedClass = new CDerivedClass();
pCDerivedClass->DoSomething(5,5);
}
Please note: error check and cleanup left to the reader...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Noted.
I had become complacent with being able to call any function implemented in the base class regardless of whether it was virtual using a pointer from any level in the derived hierarchy when there were no overloaded functions in the base class. This kinda throws me curve ball but I'm learning.
Thanks for the info.
|
|
|
|
|
hmm...what happened to inheritance?
CDerivedClass is a CBaseClass.
Logically, this doesn't seem like it should be an error.
Until you convince me otherwise
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|