Re: Loops per second of thread suddenly drops
Without knowing what the main loop is doing, including if it breaks
outs and does the restart loop again, if you see this loop
do {
GetAverageRGB();
OutputColour();
if (counting) loopc++;
} while (KeepRunning);
is showing a 30 lps, that means the two functions is using up 33 ms of
CPU time in each loop. If lps goes down to 10 lps, then the two
functions are using more cpu time - 100 ms in each loop.
So whatever is going on in those two functions.... :)
If I replace those two functions with:
Sleep(30);
I will see the 30 lps as well. if I change it to:
Sleep(100);
I see the 10 lps.
So that just to use how much time the two functions are using. You
need to figure out why. :)
Let us know.
--
GrayFox wrote:
Thanks for your reaction!
Well that's the strange thing about this all: The thread I start isn't
really doing anything with the GUI at all. It's just nicely doing it's
calculations on its own, minding its own business, unless I'm horribly
missing something here.
All that I do have is a timer set to 1 sec, and on the OnTimer() event I
read the counter that is being incremented by the worker thread every loop
and put it back to 0 again.
I then put the value I've read onto a static text object on the GUI. But
this is all happening only once a second.
Also, I forgot to mention, after the lps has dropped, it goes back up to
30-35 again as well after a while. I've used Process Explorer, and I do think
I see a slight increase in CPU usage when the lps drop, but mainly stuff like
svchost and opera using some CPU time, not much more.
Here is some code:
DWORD WINAPI Thread(LPVOID pParam) {
CMyDlg * pMyDlg;
pMyDlg = (CMyDlg *) pParam;
return pMyDlg->MainLoopFunc();
}
BOOL CMyDlg::OnInitDialog() {
HANDLE hThread = CreateThread(NULL, 0,
Thread, this, 0, NULL);
SetTimer(1, 1000, 0);
}
void CAmbloneDlg::OnTimer(UINT_PTR nIDEvent) {
CString Text;
Text.Format("Loops per second: %d lps", loopc);
StaticLoops.SetWindowTextA(Text);
loopc = 0;
CDialog::OnTimer(nIDEvent);
}
And this is the main function:
UINT CAmbloneDlg::MainLoopFunc() {
//--------------------------------------------
// Get some information about the screen etc.
// -------------------------------------------
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
do {
if (EnumDisplayDevices(NULL, settings.GetDisplayDeviceNum(), &dd, NULL)) {
// We found the monitor, now get the screen DC
hScrDC = CreateDC(NULL,dd.DeviceName,NULL,NULL);
// Get the screen resolution
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
// Create a bitmap compatible with the screen DC
hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn);
// Create a memory DC compatible to screen DC
hMemDC = CreateCompatibleDC(hScrDC);
// Create a rectangle
GetClientRect(&rect);
pDC = GetDC(); // Get the DC
do {
// ----------------------
// This is the main loop
// ----------------------
// Calculate the average screen pixel colour
GetAverageRGB();
// Now output the colour
OutputColour();
if (counting) loopc++;
} while (KeepRunning);
}
DeleteDC(hScrDC);
DeleteDC(hMemDC);
} while (restart);
return 0;
}
--
HLS