John500
asked on
How to get process information
I started to write a class that will get certain information regarding processes. The code below is as far as I got. I'm hoping for code/help to polish this off:
1) IsProcessAlive(hostname, processname) return bool
2) GetProcessCPU(hostname, processname) return text or numeric (% use of CPU)
3) GetProcessRAM(hostname, processname) return text or numeric (% use of RAM)
class CheckProcess : Action
{
public CheckProcess(string name)
: base(name)
{
type_ = "CheckProcess";
}
public override string Execute() //******* is this line correct given the fact I need to pass parameters (hostname, processname)
{
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
Console.WriteLine("Process : {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
// haven't made use of this stuff below yet
//p.StartTime (Shows the time the process started)
//p.TotalProcessorTime (Shows the amount of CPU time the process has taken)
//p.Threads ( gives access to the collection of threads in the process)
}
}
Thanks!
1) IsProcessAlive(hostname, processname) return bool
2) GetProcessCPU(hostname, processname) return text or numeric (% use of CPU)
3) GetProcessRAM(hostname, processname) return text or numeric (% use of RAM)
class CheckProcess : Action
{
public CheckProcess(string name)
: base(name)
{
type_ = "CheckProcess";
}
public override string Execute() //******* is this line correct given the fact I need to pass parameters (hostname, processname)
{
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
Console.WriteLine("Process
}
// haven't made use of this stuff below yet
//p.StartTime (Shows the time the process started)
//p.TotalProcessorTime (Shows the amount of CPU time the process has taken)
//p.Threads ( gives access to the collection of threads in the process)
}
}
Thanks!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Replace the line:
ProcessInfo pc = new ProcessInfo();
With:
PerformanceCounter pc = new PerformanceCounter();
ProcessInfo pc = new ProcessInfo();
With:
PerformanceCounter pc = new PerformanceCounter();
ASKER
I know I needed to rename the class to something like 'CheckProcessInfo' and the class to something like 'CheckProcess'
But what about those lousy references? What do I need and in what order??
Thanks!
But what about those lousy references? What do I need and in what order??
Thanks!
My previous post is not about renaming your class.
You have declared pc as type 'ProcessInfo' where it should be of type 'PerformanceCounter', so you need to replace:
ProcessInfo pc = new ProcessInfo();
With:
PerformanceCounter pc = new PerformanceCounter();
You already have the references that you need: using System.Diagnostics;
You have declared pc as type 'ProcessInfo' where it should be of type 'PerformanceCounter', so you need to replace:
ProcessInfo pc = new ProcessInfo();
With:
PerformanceCounter pc = new PerformanceCounter();
You already have the references that you need: using System.Diagnostics;
Your code should look like this:
using System;
using System.IO;
using System.Diagnostics;
namespace ProcessInfoExtractor
{
class ProcessInfo
{
PerformanceCounter pc = new PerformanceCounter();
public Process GetProcess(string hostname, string processName)
{
Process[] ps = Process.GetProcessesByName(processName, hostname);
if (ps.Length == 0)
return null;
else
return ps[0];
}
public bool IsProcessAlive(string hostname, string processName)
{
Process p = GetProcess(hostname, processName);
if (p == null)
{
return false;
}
else
{
return !p.HasExited;
}
}
public string GetProcessCPU(string hostname, string processName)
{
string str = "";
pc.CategoryName = "Process";
pc.CounterName = "% Processor Time";
pc.InstanceName = processName;
pc.MachineName = hostname;
try
{
str = pc.NextValue().ToString();
}
catch
{
str = "Error";
}
return str;
}
public string GetProcessRAM(string hostname, string processName)
{
Process p = GetProcess(hostname, processName);
if (p == null)
{
return "Error";
}
else
{
return p.PagedMemorySize64.ToString();
}
}
}
}
ASKER
Still having a problem with those references. Using the code exactly as it appears above in your last post - I get these error:
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections.Generic ;
using System.Text;
using System.ServiceProcess;
namespace ProcessInfoExtractor
{
class ProcessInfo
{
PerformanceCounter pc = new PerformanceCounter(); // ******** line 10
public Process GetProcess(string hostname, string processName) // ******** line 10
{
Process[] ps = Process.GetProcessesByName (processNa me, hostname);
...
...
Error 1 The type or namespace name 'PerformanceCounter' could not be found (are you missing a using directive or an assembly reference?) C:\@john\test\C#\GetProces sInfo\Proc essInfo.cs 10 9 GetProcessInfo
Error 2 The type or namespace name 'Process' could not be found (are you missing a using directive or an assembly reference?) C:\@john\test\C#\GetProces sInfo\Proc essInfo.cs 12 16 GetProcessInfo
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections.Generic
using System.Text;
using System.ServiceProcess;
namespace ProcessInfoExtractor
{
class ProcessInfo
{
PerformanceCounter pc = new PerformanceCounter(); // ******** line 10
public Process GetProcess(string hostname, string processName) // ******** line 10
{
Process[] ps = Process.GetProcessesByName
...
...
Error 1 The type or namespace name 'PerformanceCounter' could not be found (are you missing a using directive or an assembly reference?) C:\@john\test\C#\GetProces
Error 2 The type or namespace name 'Process' could not be found (are you missing a using directive or an assembly reference?) C:\@john\test\C#\GetProces
ASKER
I forgot to change that second '10' to '12' ......
Here is a picture of my references:
references.JPG
Here is a picture of my references:
references.JPG
ASKER
I don't know how but it straightened itself out. The program compiles and works.
Can you tell me how I can accurately display the following value for RAM:
24166400
I close this out in the mean time.
Thanks
Can you tell me how I can accurately display the following value for RAM:
24166400
I close this out in the mean time.
Thanks
ASKER
Also,
For the line that reads:
public bool IsProcessAlive(string hostname, string processName)
{
...
return !p.HasExited; // error: Feature is not supported for remote machines. (NotSupportedException was unhandled)
...
}
The parameter was:
\\MachineName
For the line that reads:
public bool IsProcessAlive(string hostname, string processName)
{
...
return !p.HasExited; // error: Feature is not supported for remote machines. (NotSupportedException was unhandled)
...
}
The parameter was:
\\MachineName
The RAM value is in bytes. divide it by 1024 to get it in KB and another 1024 to get it in MB
As for the IsProcessAlive, it's ok to replace the line
return !p.HasExited;
with
return true;
As for the IsProcessAlive, it's ok to replace the line
return !p.HasExited;
with
return true;
ASKER
Thanks for the help.
I have a couple of problems that I'm sure are straight forward. I simplified the project and made one class and one file for the project. Can you tell me how I would correct the errors below?
Thanks
Error 1 'ProcessInfo.ProcessInfo' does not contain a definition for 'CategoryName' C:\C # apps\ProcessApp\GetProcess
Error 2 'ProcessInfo.ProcessInfo' does not contain a definition for 'CounterName' C:n\C # apps\ProcessApp\GetProcess
Error 3 'ProcessInfo.ProcessInfo' does not contain a definition for 'InstanceName' C:\C # apps\ProcessApp\GetProcess
Error 4 'ProcessInfo.ProcessInfo' does not contain a definition for 'MachineName' C:n\C # apps\ProcessApp\GetProcess
Error 5 'ProcessInfo.ProcessInfo' does not contain a definition for 'NextValue' C:\C # apps\ProcessApp\GetProcess
Open in new window