最有效的方式来扫描Windows进程列表?
题
所以我目前正在当某些进程正在运行,需要时间的项目。我试图找出扫描进程列表,然后检查进程列表中的可执行名称对支持程序的列表中选择最有效的方式。
本质上的问题是两个部分:
1)最有效的方式来获得从进程列表的过程的可执行名称
2)的最有效方法这一名单与另一个列表
有关(1),的其他开发者之一被玩弄使用任务列表命令和解析出所述可执行名称。我还发现,C#有一个System.Diagnostic进程列表会自动执行此操作。我们还在努力Java和C#之间做出选择,所以我可能会朝着一个语言中性溶液瘦,但是这可能是C#中的决定性因素。
有关(2),所支持的进程列表可能是小的平均(1-10处理名)。我们只能通过列表运行的每个过程,但我们认为这可能是太多的旧电脑,所以我们周围使用含初始进程列表中按字母顺序平衡AVL树的想法被折腾的应用程序启动时,并检查一切针对第一个,然后对我们的支持进程名称列表中,如果它不是在树中检查。
任何建议都不胜感激。
编辑:显然,你可以通过进程可执行文件名过滤任务列表,因此我们可以只执行,对于支持的进程列表上的每个进程的
编辑2:是否有一个任务列表相当于是用于Windows XP Home 的
作品?解决方案
如果您有任务列表去,它实际上可能会更快只需运行一次该命令,并取回所有的结果,而不是运行它为每个可执行文件的名称。有一些开销exec'ing的过程,并获得输出。 (当你回来的结果,你必须通过他们在代码回路,但是这可能会更快,通常不会有同时运行,所以它不会太差超过100个过程)。您应该写一个测试和检查,看看是否是真的。
在C#,Process.GetProcesses()是去的最佳方式。
在Java中,没有真正的等效类/方法。获得一个进程列表是相当OS特定的,所以Java的设计者必须决定不/抽象的这种能力融入基础的Java类。你可能不得不调用Runtime.getRuntime()。在Unix / Linux EXEC( “tasklist.exe”),以获得在Windows上的结果,或者exec( “PS”)。
其他提示
希望我正确地理解你的问题。你只是想比较的过程,在Windows上运行的活动进程列表? C#
static void Main(string[] args)
{
// Approved processes.
List<string> approvedProcesses = new List<string>();
approvedProcesses.Add("chrome");
approvedProcesses.Add("svchost");
// LINQ query for processes that match your approved processes.
var processes = from p in System.Diagnostics.Process.GetProcesses()
where approvedProcesses.Contains(p.ProcessName)
select p;
// Output matching processes to console.
foreach (var process in processes)
Console.WriteLine(process.ProcessName + " " + process.Id.ToString());
Console.ReadLine();
}
多久你会做这个检查?除非它基本上是恒定的,我就不会担心(SO上一个共同的主题)优化为时尚早。
一个系统通常有小于100个进程在运行,即使它有两三千,优化数据结构和制定最有效的算法确实也救不了你多少时间。
话虽如此,我会建议你得到所有正在运行的进程和名单与内存的核准清单。任何瓶颈将可能是与呼叫到Windows询问的过程,所以这样做一次,而不是多次将是有益的。