#90295 - 2002-12-04 06:39 PM
beta - KiXforms: ProcessMon
|
Chris S.
MM club member
Registered: 2002-03-18
Posts: 2368
Loc: Earth
|
I've been developing this script (rather slowly) for a while now and I thought it was time to solicit some feedback.
It uses WMI to monitor processes and report back some of the raw data in a nice little GUI. The look and feel is complete ripped off of Task Manager.
Anyway, I was just looking for some response on how useful this might be and what features or changes should be made.
Thanks...
Screen Shots:
Code:
Break On ;--------------------------------------------------------------------------- ; Process Listing Form ;--------------------------------------------------------------------------- $frmProcesses = CreateObject("Kixtart.Form") $frmProcesses.Size = 400,350 $frmProcesses.Text = "Process List" $frmProcesses.FontName = "Veranda" $lvwProcessList = $frmProcesses.ListView() $lvwProcessList.Left = 5 $lvwProcessList.Top = 10 $lvwProcessList.Width = $frmProcesses.ClientWidth - 10 $lvwProcessList.Bottom = $frmProcesses.ClientHeight - 35 $lvwProcessList.FullRowSelect = True $lvwProcessList.Sorted = 1 $nul = $lvwProcessList.Columns.Add("Process Name",130) $nul = $lvwProcessList.Columns.Add("PID",54,1) $nul = $lvwProcessList.Columns.Add("CPU Time",90,1) $nul = $lvwProcessList.Columns.Add("Mem Usage",90,1) $cboComputer = $frmProcesses.ComboBox(,20,30,200) $cboComputer.Top = $lvwProcessList.Bottom + 5 $cboComputer.Left = 5 $cboComputer.Additem (@WKSTA) $cboComputer.Value = "@WKSTA" $cboComputer.Sorted = 1 $btnListProcesses = $frmProcesses.Button $btnListProcesses.Text = "Refresh" $btnListProcesses.Top = $lvwProcessList.Bottom + 5 $btnListProcesses.Left = $cboComputer.Right + 5 $btnListProcesses.Size = 60,25 $btnListProcesses.OnClick = "$$nul=fnGetProcessList($$cboComputer.Value)" $btnListProcesses.ToolTip = "Refresh the process listing" $btnMonProcess = $frmProcesses.Button $btnMonProcess.Text = "Monitor" $btnMonProcess.Top = $lvwProcessList.Bottom + 5 $btnMonProcess.Left = $btnListProcesses.Right + 5 $btnMonProcess.Size = 60,25 $btnMonProcess.OnClick = "$$nul=fnMonProcess()" $btnMonProcess.ToolTip = "Monitor the currently selected process" ;--------------------------------------------------------------------------- ; Process Monitor Form ;--------------------------------------------------------------------------- $frmProcess = CreateObject("Kixtart.Form") $frmProcess.Size = 420,300 $frmProcess.Topmost = True $frmProcess.Text = "Monitoring Process" $frmProcess.FontName = "Veranda" $frmProcess.MinButton = 1 $fraCPUUsage = $frmProcess.GroupBox $fraCPUUsage.Size = 80,80 $fraCPUUsage.Text = "CPU Usage" $fraCPUUsage.Top = 5 $fraCPUUsage.Left = 5 $picCPUUsage = $fraCPUUsage.PictureBox $picCPUUsage.ScaleHeight = 51 $picCPUUsage.Width = 60 $picCPUUsage.BackColor = Black $picCPUUsage.Top = 15 $picCPUUsage.Left = 10 $prgCPUUsage = $picCPUUsage.ProgressBar $prgCPUUsage.Height = 30 $prgCPUUsage.Width = 30 $prgCPUUsage.Center $prgCPUUsage.Top = 5 $prgCPUUsage.ForeColor = Lawngreen $prgCPUUsage.BackColor = Black $prgCPUUsage.BorderStyle = 1 $prgCPUUsage.Orientation = 1 $prgCPUUsage.Style = 1 $prgCPUUsage.Max = 100 $lblCPUUsage = $picCPUUsage.Label $lblCPUUsage.Height = 15 $lblCPUUsage.Width = 28 $lblCPUUsage.Center $lblCPUUsage.Top = $prgCPUUsage.Bottom $lblCPUUsage.ForeColor = Lawngreen $lblCPUUsage.BackColor = Black $lblCPUUsage.BorderStyle = 1 $lblCPUUsage.Alignment = 1 $lblCPUUsage.Text = "%" $lblCPUUsage.FontName = "Lucida Console" $lblCPUUsage.FontSize = 8 $fraCPUHist = $frmProcess.GroupBox $fraCPUHist.Size = 320,80 $fraCPUHist.Text = "CPU Usage History" $fraCPUHist.Top = 5 $fraCPUHist.Left = $fraCPUUsage.Right + 5 $picCPUHist = $fraCPUHist.PictureBox $picCPUHist.ScaleHeight = 51 $picCPUHist.ScaleWidth = 300 $picCPUHist.BackColor = Black $picCPUHist.Top = 15 $picCPUHist.Left = 10 $fraMEMUsage = $frmProcess.GroupBox $fraMEMUsage.Size = 80,80 $fraMEMUsage.Text = "MEM Usage" $fraMEMUsage.Top = $fraCPUUsage.Bottom $fraMEMUsage.Left = 5 $picMEMUsage = $fraMEMUsage.PictureBox $picMEMUsage.ScaleHeight = 51 $picMEMUsage.Width = 60 $picMEMUsage.BackColor = Black $picMEMUsage.Top = 15 $picMEMUsage.Left = 10 $prgMEMUsage = $picMEMUsage.ProgressBar $prgMEMUsage.Height = 30 $prgMEMUsage.Width = 30 $prgMEMUsage.Center $prgMEMUsage.Top = 5 $prgMEMUsage.ForeColor = Lawngreen $prgMEMUsage.BackColor = Black $prgMEMUsage.BorderStyle = 1 $prgMEMUsage.Orientation = 1 $prgMEMUsage.Style = 1 $prgMEMUsage.Max = 100 $lblMEMUsage = $picMEMUsage.Label $lblMEMUsage.Height = 15 $lblMEMUsage.Width = 50 $lblMEMUsage.Center $lblMEMUsage.Top = $prgMEMUsage.Bottom $lblMEMUsage.ForeColor = Lawngreen $lblMEMUsage.BackColor = Black $lblMEMUsage.BorderStyle = 1 $lblMEMUsage.Alignment = 2 $lblMEMUsage.FontName = "Lucida Console" $lblMEMUsage.FontSize = 8 $fraMEMHist = $frmProcess.GroupBox $fraMEMHist.Size = 320,80 $fraMEMHist.Text = "MEM Usage History" $fraMEMHist.Top = $fraCPUHist.Bottom $fraMEMHist.Left = $fraMEMUsage.Right + 5 $picMEMHist = $fraMEMHist.PictureBox $picMEMHist.ScaleHeight = 51 $picMEMHist.ScaleWidth = 300 $picMEMHist.BackColor = Black $picMEMHist.Top = 15 $picMEMHist.Left = 10 $fraTotals = $frmProcess.GroupBox $fraTotals.Size = 200,80 $fraTotals.Text = "Totals" $fraTotals.Top = $fraMEMHist.Bottom $fraTotals.Left = $fraMEMUsage.Left $lblHandles = $fraTotals.Label $lblHandles.Size = 80,15 $lblHandles.Top = 15 $lblHandles.Left = 10 $lblHandles.Text = "Handles" $lblHandlesCount = $fraTotals.Label $lblHandlesCount.Size = 80,15 $lblHandlesCount.Top = $lblHandles.Top $lblHandlesCount.Left = $lblHandles.Right + 20 $lblHandlesCount.Alignment = 1 $lblThreads = $fraTotals.Label $lblThreads.Size = 80,15 $lblThreads.Top = $lblHandles.Bottom $lblThreads.Left = $lblHandles.Left $lblThreads.Text = "Threads" $lblThreadsCount = $fraTotals.Label $lblThreadsCount.Size = 80,15 $lblThreadsCount.Top = $lblThreads.Top $lblThreadsCount.Left = $lblThreads.Right + 20 $lblThreadsCount.Alignment = 1 $lblElapsedTime = $fraTotals.Label $lblElapsedTime.Size = 80,15 $lblElapsedTime.Top = $lblThreads.Bottom $lblElapsedTime.Left = $lblThreads.Left $lblElapsedTime.Text = "Elapsed Time" $lblElapsedTimeCount = $fraTotals.Label $lblElapsedTimeCount.Size = 80,15 $lblElapsedTimeCount.Top = $lblElapsedTime.Top $lblElapsedTimeCount.Left = $lblElapsedTime.Right + 20 $lblElapsedTimeCount.Alignment = 1 $fraOperations = $frmProcess.GroupBox $fraOperations.Size = 200,80 $fraOperations.Text = "Data Operations" $fraOperations.Top = $fraTotals.Top $fraOperations.Left = $fraTotals.Right +5 $lblDataPerSec = $fraOperations.Label("Data Bytes/Sec",10,15,90,15) $lblDataPerSecCount = $fraOperations.Label("",$lblDataPerSec.Right+20,$lblDataPerSec.Top,70,15) $lblDataPerSecCount.Alignment = 1 $lblReadsPerSec = $fraOperations.Label("Read Bytes/Sec",10,$lblDataPerSec.Bottom,90,15) $lblReadsPerSecCount = $fraOperations.Label("",$lblReadsPerSec.Right+20,$lblReadsPerSec.Top,70,15) $lblReadsPerSecCount.Alignment = 1 $lblWritesPerSec = $fraOperations.Label("Write Bytes/Sec",10,$lblReadsPerSec.Bottom,90,15) $lblWritesPerSecCount = $fraOperations.Label("",$lblWritesPerSec.Right+20,$lblWritesPerSec.Top,70,15) $lblWritesPerSecCount.Alignment = 1 ;--------------------------------------------------------------------------- ; Start Application ;--------------------------------------------------------------------------- fnGetProcessList($cboComputer.Value) $frmProcesses.Center $frmProcesses.Show While $frmProcesses.Visible $nul=Execute($frmProcesses.DoEvents) Loop $objWMIService="" Exit(1) ;--------------------------------------------------------------------------- ; Functions ;--------------------------------------------------------------------------- Function fnGetProcessList(Optional $sComputer) If $sComputer="" $sComputer = "." EndIf $frmProcesses.Text = "Process List for "+$sComputer $frmProcesses.MousePointer = 11 $lvwProcessList.Items.Clear $lvwProcessList.BeginUpdate $objWMIService = GetObject("winmgmts:\\"+$sComputer+"\root\cimv2") If @ERROR $nul = $frmProcesses.MsgBox(@SERROR,"Error",16) $frmProcesses.MousePointer=0 Exit(1) EndIf $colItems = $objWMIService.ExecQuery("Select * from Win32_Process",,48) For each $objItem in $colItems $Item=$lvwProcessList.Items.Add($objItem.Name) $Item.SubItems(1).Text=$objItem.ProcessID $Item.SubItems(2).Text=fnSecondsToHMMSS(CInt((CDbl($objItem.UserModeTime) +CDbl($objItem.KernelModeTime))/10000000)) $Item.SubItems(3).Text=""+FormatNumber(CDbl($objItem.WorkingSetSize)/1024,0)+" K" Next $frmProcesses.MousePointer=0 $lvwProcessList.EndUpdate EndFunction Function fnMonProcess() $frmProcesses.Hide fnDrawGrid() $frmProcess.Center $frmProcess.Show For Each $Item in $lvwProcessList.SelectedItems $sProcess=$Item.SubItems(0).Text $sPID=$Item.SubItems(1).Text Next $colItems = $objWMIService.ExecQuery("Select * from Win32_LogicalMemoryConfiguration",,48) For each $objItem in $colItems $lMEMMax=CDbl($objItem.TotalPageFileSpace) ;"TotalPhysicalMemory: " + $objItem.TotalPhysicalMemory Next $objProcess = $objWMIService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process " +'WHERE IDProcess = $sPID AND Name <> "_Total"',,48) For Each $objItem in $objProcess $frmProcess.Caption="Monitoring "+$sProcess+" (PID: "+$objItem.IDProcess+") on " +$cboComputer.Value Next $prgCPUUsage.Refresh $prgMEMUsage.Refresh $tl=-6 :MonitorLoop For $x = $tl to $picCPUHist.ScaleWidth step 5 $objProcess = $objWMIService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process " +'WHERE IDProcess = $sPID AND Name <> "_Total"',,48) For Each $objItem in $objProcess $sProcessName=$objItem.Name $dP2=CDbl($objItem.PercentProcessorTime) $dT2=CDbl($objItem.Timestamp_Sys100NS) $prgMEMUsage.Value=Int(CDBL($objItem.WorkingSet)/1024/$lMEMMax*100) $lblMEMUsage.Text=CDBL($objItem.WorkingSet)/1024 $lblHandlesCount.Text = $objItem.HandleCount $lblThreadsCount.Text = $objItem.ThreadCount $lblElapsedTimeCount.Text = fnSecondsToHMMSS(CInt((CDbl($objItem.Timestamp_Object) -CDbl($objItem.ElapsedTime))/CDbl($objItem.Frequency_Object))) $xDO2=CDbl($objItem.IODataBytesPerSec) $xRO2=CDbl($objItem.IOReadBytesPerSec) $xWO2=CDbl($objItem.IOWriteBytesPerSec) $yDO2=CDbl($objItem.Timestamp_PerfTime) Next $lCPercent=Fix((($dP2-$dP1) / ($dT2-$dT1))*100) If $lCPercent>100 $lCPercent=100 EndIf $prgCPUUsage.Value = $lCPercent $lblCPUUsage.Text = ""+$lCPercent+"%" $yM2=50-$prgMEMUsage.Value/2 $yC2=50-$lCPercent/2 $picMEMHist.Line($x,$yM1,$x+5,$yM2) $picCPUHist.Line($x,$yC1,$x+5,$yC2) ;Debug On $lblDataPerSecCount.Caption = FormatNumber(Int(($xDO2-$xDO1)/(($yDO2-$yDO1)/3579545)),0) $lblReadsPerSecCount.Caption = FormatNumber(Int(($xRO2-$xRO1)/(($yDO2-$yDO1)/3579545)),0) $lblWritesPerSecCount.Caption = FormatNumber(Int(($xWO2-$xWO1)/(($yDO2-$yDO1)/3579545)),0) ;Debug Off If Not $frmProcess.Visible or $sProcessName='' $frmProcess.Hide $frmProcesses.Show fnGetProcessList($cboComputer.Value) Exit() EndIf $yM1=$yM2 $yC1=$yC2 $dP1=$dP2 $dT1=$dT2 $xDO1=$xDO2 $xRO1=$xRO2 $xWO1=$xWO2 $yDO1=$yDO2 $sProcessName='' Sleep 0.5 Next fnDrawGrid() $tl=0 Goto "MonitorLoop" EndFunction Function fnDrawGrid() $picCPUHist.Clear $picMEMHist.Clear $picCPUHist.ForeColor = Green $picMEMHist.ForeColor = Green For $y=10 to $picCPUHist.ScaleHeight step 10 $picCPUHist.Line(0,$y,$picCPUHist.ScaleWidth,$y) $picMEMHist.Line(0,$y,$picMEMHist.ScaleWidth,$y) Next For $x=-11 to $picCPUHist.ScaleWidth step 10 $picCPUHist.Line($x,0,$x,$picCPUHist.ScaleWidth) $picMEMHist.Line($x,0,$x,$picMEMHist.ScaleWidth) Next $picCPUHist.ForeColor = Lawngreen $picMEMHist.ForeColor = Lawngreen EndFunction Function fnSecondsToHMMSS($lSeconds) If Not VarType($lSeconds)=3 $fnSecondsToHMMSS="Invalid VarType: "+VarType($lSeconds) Exit(1) EndIf If $lSeconds < 0 $fnSecondsToHMMSS="Error" Exit(1) EndIf Select Case $lSeconds<60 If $lSeconds<10 $lSeconds="0"+$lSeconds EndIf $fnSecondsToHMMSS="0:00:"+$lSeconds Case $lSeconds<3600 $lMinutes=$lSeconds/60 $lSeconds=$lSeconds-$lMinutes*60 If $lMinutes<10 $lMinutes="0"+$lMinutes EndIf If $lSeconds<10 $lSeconds="0"+$lSeconds EndIf $fnSecondsToHMMSS="0:"+$lMinutes+":"+$lSeconds Case 1 $lHours=$lSeconds/3600 $lSeconds=$lSeconds-$lHours*3600 $lMinutes=$lSeconds/60 $lSeconds=$lSeconds-$lMinutes*60 If $lMinutes<10 $lMinutes="0"+$lMinutes EndIf If $lSeconds<10 $lSeconds="0"+$lSeconds EndIf $fnSecondsToHMMSS=""+$lHours+":"+$lMinutes+":"+$lSeconds EndSelect EndFunction
Edited by Shawn (2006-01-24 10:46 PM)
|
Top
|
|
|
|
#90301 - 2002-12-04 09:58 PM
Re: beta - KiXforms: ProcessMon
|
Chris S.
MM club member
Registered: 2002-03-18
Posts: 2368
Loc: Earth
|
The CLS is just in there while I develop the script. It won't be a permanent fixture.
As always, WKixers must remove the CLS to prevent the console window from appearing.
|
Top
|
|
|
|
#90303 - 2002-12-04 10:01 PM
Re: beta - KiXforms: ProcessMon
|
Chris S.
MM club member
Registered: 2002-03-18
Posts: 2368
Loc: Earth
|
I don't think so. Actually, I think that would make a good item for the suggestion box.
|
Top
|
|
|
|
#90304 - 2002-12-04 10:05 PM
Re: beta - KiXforms: ProcessMon
|
Kdyer
KiX Supporter
Registered: 2001-01-03
Posts: 6241
Loc: Tigard, OR
|
Chris,
Sweet code!
A thought.. When you are looking at Mem Usage, PID, etc... Can it change the sort order to show what processes are hogs?
{Edit} Looks like just the PID and Mem Usage. {/Edit}
Kent [ 04. December 2002, 22:07: Message edited by: kdyer ]
|
Top
|
|
|
|
#90308 - 2002-12-04 10:25 PM
Re: beta - KiXforms: ProcessMon
|
Kdyer
KiX Supporter
Registered: 2001-01-03
Posts: 6241
Loc: Tigard, OR
|
Couple of more things..
Monitoring a Domain Controller(2k) on the same Domain - Flashes back to the process list Monitoring a Domain Controller(2k) on a Child Domain - Works fine Could not Monitor local machine (XP), but process list works fine.
Kent
|
Top
|
|
|
|
#90310 - 2002-12-05 06:53 AM
Re: beta - KiXforms: ProcessMon
|
Kdyer
KiX Supporter
Registered: 2001-01-03
Posts: 6241
Loc: Tigard, OR
|
Yes.. at the time of the last post..
Have not tried any updates.
Kent
|
Top
|
|
|
|
#90311 - 2002-12-05 04:47 PM
Re: beta - KiXforms: ProcessMon
|
Kdyer
KiX Supporter
Registered: 2001-01-03
Posts: 6241
Loc: Tigard, OR
|
ok..
Status.
Monitoring a Domain Controller(2k) on the same Domain - Flashes back to the process list Monitoring a Domain Controller(2k) on a Child Domain - Works fine Local machine (XP)works fine for both the Monitor and process list.
Kent [ 05. December 2002, 16:47: Message edited by: kdyer ]
|
Top
|
|
|
|
#90313 - 2002-12-05 09:03 PM
Re: beta - KiXforms: ProcessMon
|
Chris S.
MM club member
Registered: 2002-03-18
Posts: 2368
Loc: Earth
|
I'm using build 37. Still there.
|
Top
|
|
|
|
Moderator: Shawn, ShaneEP, Ruud van Velsen, Arend_, Jochen, Radimus, Glenn Barnas, Allen, Mart
|
0 registered
and 248 anonymous users online.
|
|
|