C# 监视同名进程,我做错了什么
我正在制作一个测试WinForm应用程序,以尝试和监视具有相同名称的进程。但出于某种原因,它不起作用 但我表格上的标签保持为零 表单的全局变量:C# 监视同名进程,我做错了什么,c#,process,cpu-usage,performancecounter,C#,Process,Cpu Usage,Performancecounter,我正在制作一个测试WinForm应用程序,以尝试和监视具有相同名称的进程。但出于某种原因,它不起作用 但我表格上的标签保持为零 表单的全局变量: Thread checkProcess; List<PerformanceCounter> pcs; 线程检查过程; 列出个人电脑; 单击启动监视过程的按钮 private void btnMonitor_Click(object sender, EventArgs e) { List<Process> proc =
Thread checkProcess;
List<PerformanceCounter> pcs;
线程检查过程;
列出个人电脑;
单击启动监视过程的按钮
private void btnMonitor_Click(object sender, EventArgs e)
{
List<Process> proc = new List<Process>();
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName.IndexOf(txtProcessName.Text) > -1)
{
proc.Add(p);
}
}
pcs = new List<PerformanceCounter>();
int k = 0;
foreach (Process p in proc)
{
pcs.Add(new PerformanceCounter("Process", "% Processor Time", k > 0 ?
string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName, true));
lstbxPC.Items.Add(k > 0 ?
string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName);
k++;
}
checkProcess = new Thread(CheckProcess);
checkProcess.Start();
}
private void btnMonitor\u单击(对象发送方,事件参数e)
{
List proc=新列表();
foreach(Process.getprocesss()中的进程p)
{
if(p.ProcessName.IndexOf(txtProcessName.Text)>-1)
{
程序添加(p);
}
}
pcs=新列表();
int k=0;
foreach(进程中的进程p)
{
pcs.Add(新性能计数器(“进程”,处理器时间百分比),k>0?
Format(“{0}{1}”,p.ProcessName,k):p.ProcessName,true);
lstbxPC.Items.Add(k>0?
格式(“{0}{1}”,p.ProcessName,k):p.ProcessName);
k++;
}
checkProcess=新线程(checkProcess);
checkProcess.Start();
}
监视和更新标签的方法(在其自己的线程中启动):
private void CheckProcess()
{
int temp = 0;
while (true)
{
temp = 0;
foreach (PerformanceCounter pc in pcs)
{
if (temp < pc.NextValue())
{
temp = (int)pc.NextValue();
}
}
// Set the label in a ThreadSafe way. This does work
SetControlPropertyThreadSafe(lblCPU, "Text", Convert.ToString(temp) + "%");
Thread.Sleep(1000);
}
}
private void CheckProcess()
{
内部温度=0;
while(true)
{
温度=0;
foreach(pc中的PerformanceCounter pc)
{
如果(温度
有很多东西需要检查:
- 您的
是否有物品?(调试)PC
中的文本是什么?(模式是txtProcessName
,比如devenv#1、devenv#2、…){processname without exe}{nb}
- 您能读取性能计数器吗?(检查安全性)
- 因为您正在将NextValue()强制转换为int,所以不会看到任何小于1%的更改
private void btnMonitor_Click(object sender, EventArgs e)
{
var proc = Process.GetProcesses().Where(p => p.ProcessName.IndexOf(this.txtProcessName.Text) > -1);
var k = 1;
var appendSuffix = proc.Count() > 1;
this.pcs = new List<PerformanceCounter>();
foreach (var p in proc)
{
this.pcs.Add(new PerformanceCounter(
"Process",
"% Processor Time",
appendSuffix ? string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName,
true));
this.lstbxPC.Items.Add(appendSuffix ? string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName);
k++;
}
this.checkProcess = new Thread(this.CheckProcess);
this.checkProcess.Start();
}
private void CheckProcess()
{
while (true)
{
var temp = 0;
foreach (var pc in this.pcs)
{
var nextValue = pc.NextValue();
if (temp < nextValue)
{
temp = (int)nextValue;
}
}
// Set the label in a ThreadSafe way. This does work.
SetControlPropertyThreadSafe(lblCPU, "Text", Convert.ToString(temp) + "%");
Thread.Sleep(1000);
}
}
private void btnMonitor\u单击(对象发送方,事件参数e)
{
var proc=Process.GetProcesses()。其中(p=>p.ProcessName.IndexOf(this.txtProcessName.Text)>-1);
var k=1;
var appendSuffix=proc.Count()>1;
this.pcs=新列表();
foreach(过程中的var p)
{
此.pcs.Add(新性能计数器(
“过程”,
“%Processor Time”,
appendSuffix?string.Format(“{0}{1}”,p.ProcessName,k):p.ProcessName,
是的);
this.lstbxPC.Items.Add(appendSuffix?string.Format(“{0}{1}”,p.ProcessName,k):p.ProcessName);
k++;
}
this.checkProcess=新线程(this.checkProcess);
这个.checkProcess.Start();
}
私有无效检查进程()
{
while(true)
{
var-temp=0;
foreach(此.pcs中的var pc)
{
var nextValue=pc.nextValue();
如果(温度<下一个值)
{
temp=(int)下一个值;
}
}
//以线程安全的方式设置标签。这确实有效。
SetControlPropertyThreadSafe(lblCPU,“文本”,Convert.ToString(temp)+“%”;
睡眠(1000);
}
}
不要连续调用pc.NextValue()两次,每秒只调用一次。我真不敢相信我没有看到这一点!很可能是它不起作用的原因。你是对的,如果进程停止,我应该处理。请在私有void CheckProcess()中尝试捕获
方法。捕获后,只需从列表中删除进程停止的PerformanceCounter
。应该可以做到这一点。我喜欢您获取进程的方式。我从哪里可以了解更多如何使用这样的代码?这就是所谓的LINQ(语言集成查询)。下面是一个页面,其中包含一些代码示例,您可以用来开始学习: