繁体   English   中英

扫描Windows进程列表的最有效方法?

[英]Most efficient way to scan the windows process list?

所以我目前正在一个项目上,当某些进程正在运行时,该项目需要时间。 我试图找出最有效的方法来扫描进程列表,然后对照支持的程序列表检查进程列表可执行名称。

本质上,问题是两个部分:

1)从流程列表中获取流程可执行文件名称的最有效方法

2)比较此列表与另一个列表的最有效方法

对于(1),其他开发人员之一正在使用tasklist命令并解析可执行文件名称。 我还发现C#有一个System.Diagnostic进程列表,它将自动执行此操作。 我们仍在尝试在Java和C#之间做出选择,因此我可能会倾向于语言中立的解决方案,但这可能是C#的决定因素。

对于(2),受支持的进程列表可能平均较小(1-10个进程名称)。 我们可以只运行列表中的每个进程,但是我们认为这对于较旧的PC来说可能太多了,因此我们在考虑使用一个字母顺序平衡的AVL树的想法,该树包含应用程序启动时的初始进程列表,并检查所有内容首先针对它,然后针对树中没有的受支持的进程名称列表进行检查。

任何建议,不胜感激。

编辑:显然,您可以按进程可执行文件名称过滤任务列表,因此我们可以对受支持的进程列表中的每个进程执行此操作。

编辑2:是否有适用于Windows XP Home的任务列表?

如果使用tasklist,实际上只运行一次命令并返回所有结果,而不是为每个可执行文件名称运行它实际上会更快。 执行流程和获取输出会产生一些开销。 (当获得结果时,必须在代码中循环遍历它们,但这可能会更快。通常一次运行的进程不会超过100个,因此也不会太糟。)应该编写一个测试并检查是否正确。

在C#中,Process.GetProcesses()是最好的方法。

在Java中,实际上没有等效的类/方法。 获取进程列表是特定于OS的,因此Java设计人员必须决定不将此功能集成/抽象到基本Java类中。 您可能必须要Runtime.getRuntime()。exec(“ tasklist.exe”)才能在Windows上获得结果,而在Unix / Linux上则需要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询问有关进程的电话有关,因此一次而不是反复进行将是有益的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM