;Autor: dell_jockey EnableExplicit Define ev Global gCurrentUsage.d #EMA_Samples = 20 Procedure.d EMA_smoothing(raw.d, samples.w) Static Alpha.d Protected CurrentEMA.d Static PriorEMA.d Alpha.d = 2 / (samples.w + 1) CurrentEMA.d = priorEMA.d + (Alpha.d * (raw.d - priorEMA.d)) PriorEMA.d = CurrentEMA.d ProcedureReturn CurrentEMA.d EndProcedure Procedure MonitorCPU(void) Protected creation.FILETIME Protected exit.FILETIME Protected kernel.FILETIME Protected user.FILETIME Protected sysinfo.SYSTEM_INFO Protected numprocs Protected h Protected oldkernel Protected olduser Protected rawCurrentUsage.d GetSystemInfo_(@sysinfo) numprocs = sysinfo\dwNumberOfProcessors h = OpenProcess_(#PROCESS_QUERY_INFORMATION, #False, GetCurrentProcessId_()) GetProcessTimes_(h,@creation,@exit,@kernel,@user) oldkernel=kernel\dwlowdatetime olduser=user\dwlowdatetime Delay(500) Repeat GetProcessTimes_(h,@creation,@exit,@kernel,@user) rawCurrentUsage.d = ((((user\dwlowdatetime-olduser)+(kernel\dwlowdatetime-oldkernel))/500)/100)/numprocs gCurrentUsage.d = EMA_smoothing(rawCurrentUsage.d, #EMA_Samples) olduser=user\dwlowdatetime oldkernel=kernel\dwlowdatetime Delay(500) ForEver EndProcedure CreateThread(@MonitorCPU(),0) InitSprite() InitSprite3D() OpenWindow(0,0,0,640,480,"CPU Load Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) CreateSprite(0, 128,128, #PB_Sprite_Texture) If StartDrawing(SpriteOutput(0)) Box(0,0,128,128,#Red) StopDrawing() EndIf CreateSprite3D(0,0) CreateSprite3D(1,0) CreateSprite3D(2,0) Sprite3DQuality(1) Repeat ClearScreen(0) If StartDrawing(ScreenOutput()) DrawText(0,0,"CPU Usage: "+StrD(gCurrentUsage,2)+"%", #White, #Black) StopDrawing() EndIf If Start3D() RotateSprite3D(0,1,1) RotateSprite3D(1,1,1) RotateSprite3D(2,1,1) DisplaySprite3D(0,100,100) DisplaySprite3D(1,250,100) DisplaySprite3D(2,400,100) Stop3D() EndIf FlipBuffers() Delay(1) ev = WindowEvent() Until ev = #WM_CLOSE