3

所以我目前正在研究一个需要在某些进程运行时计时的项目。我试图找出扫描进程列表的最有效方法,然后根据支持的程序列表检查进程列表可执行名称。

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

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

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

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

对于 (2),支持的进程列表平均可能很小(1-10 个进程名称)。我们可以只通过列表运行每个进程,但我们认为这对于旧 PC 来说可能太多了,所以我们折腾了使用按字母顺序排列的 AVL 树的想法,该树包含应用程序启动时的初始进程列表,并检查所有内容首先对照它,然后检查我们支持的进程名称列表(如果它不在树中)。

非常感谢任何建议。

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

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

4

3 回答 3

4

如果您使用任务列表,实际上只运行一次命令并取回所有结果可能会更快,而不是为每个可执行文件名称运行它。执行进程和获取输出有一些开销。(当你得到结果时,你必须在代码中循环它们,但这可能会更快。通常一次运行的进程不会超过 100 个,所以不会太糟糕。)你应该编写一个测试并检查是否属实。

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

在 Java 中,实际上并没有等效的类/方法。获取进程列表是非常特定于操作系统的,因此 Java 设计者必须决定不将此功能集成/抽象到基本 Java 类中。您可能必须 Runtime.getRuntime().exec("tasklist.exe") 在 Windows 上获得结果,或在 Unix/Linux 上获得 exec("ps")。

于 2009-04-20T03:14:12.903 回答
2

希望我能正确理解你的问题。您是否只是想将进程列表与 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();

}
于 2009-04-20T03:23:31.350 回答
1

你多久做一次这个检查?除非它基本上是恒定的,否则我不会担心过早优化(SO 的常见主题)。

一个系统通常运行的进程少于 100 个,即使它有几千个,优化数据结构和设计最有效的算法也不会为您节省太多时间。

话虽如此,我建议您获取所有正在运行的进程并将该列表与您在内存中批准的列表进行比较。任何瓶颈都可能与调用 Windows 来询问进程有关,因此这样做一次而不是重复将是有益的。

于 2009-04-20T03:30:28.573 回答