Frage

Ich arbeite derzeit an einem Projekt, das Zeit muss, wenn bestimmte Prozesse ausgeführt werden. Ich versuche, den effizientesten Weg zum Scannen der Prozessliste zu finden und dann die ausführbaren Namen der Prozessliste mit der Liste der unterstützten Programme zu überprüfen.

Im Wesentlichen sind das Problem zwei Teile:

1) Effizienteste Möglichkeit, die ausführbaren Prozessnamen aus der Prozessliste zu erhalten

2) Effizienteste Möglichkeit, diese Liste mit einer anderen Liste zu vergleichen

Für (1) spielte einer der anderen Entwickler mit der Verwendung des Befehls auf Tasklist herum und analysierte die ausführbaren Namen. Ich habe auch herausgefunden, dass C# über ein System verfügt. Diagnostische Prozessliste, die dies automatisch erledigt. Wir versuchen immer noch, zwischen Java und C# zu entscheiden, also würde ich mich wahrscheinlich zu einer Sprachneutrallösung neigen, aber dies könnte ein entscheidender Faktor für C# sein.

Für (2) kann die unterstützte Prozessliste im Durchschnitt gering sein (1-10 Prozessnamen). Wir konnten einfach jeden Prozess durch die Liste ausführen, aber wir dachten, dies könnte für ältere PCs zu viel sein. Deshalb haben wir die Idee, einen alphabetisch ausgewogenen AVL -Baum zu verwenden, mit der Ausgangsprozessliste zu verwenden, wenn die Anwendung startet, und alles zu überprüfen Gegen diese und dann gegen unsere unterstützte Prozessnamenliste, wenn es nicht im Baum ist.

Alle Vorschläge werden sehr geschätzt.

Bearbeiten: Anscheinend können Sie die Taskliste mit dem ausführbaren Prozess des Prozesses filtern, damit wir dies einfach für jeden Prozess in der unterstützten Prozessliste tun können.

Bearbeiten 2: Gibt es ein Tasklist -Äquivalent, das für Windows XP Home funktioniert?

War es hilfreich?

Lösung

Wenn Sie sich für die TaskList entscheiden, ist es möglicherweise schneller, den Befehl einmal auszuführen und alle Ergebnisse zurückzugewinnen, anstatt ihn für jeden Ihrer ausführbaren Namen auszuführen. Es gibt einige Overheads, um einen Prozess auszuführen und die Ausgabe zu erhalten. (Wenn Sie die Ergebnisse zurückerhalten, müssen Sie sie im Code durchlaufen, aber dies könnte schneller sein. Normalerweise werden nicht mehr als 100 Prozesse gleichzeitig ausgeführt, sodass es nicht schlecht ist.) Sie Sollte einen Test schreiben und überprüfen, ob das wahr ist.

In C#ist process.getProcesses () der beste Weg.

In Java gibt es keine äquivalente Klasse/Methode. Das Erhalten einer Prozessliste ist ziemlich osspezifisch, sodass die Java-Designer beschlossen haben müssen, diese Fähigkeit nicht in die Basis-Java-Klassen zu integrieren/zusammenzufassen. Sie müssen wahrscheinlich runTime.getRuntime (). Exec ("taskList.exe") runnen, um die Ergebnisse unter Windows oder exec ("ps") unter UNIX/Linux zu erhalten.

Andere Tipps

Hoffentlich verstehe ich Ihre Frage richtig. Versuchen Sie einfach, eine Liste von Prozessen mit aktiven Prozessen zu vergleichen, die unter Windows ausgeführt werden? 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();

}

Wie oft werden Sie diesen Check durchführen? Wenn es nicht im Grunde genommen konstant ist, würde ich mir keine Sorgen machen, zu früh zu optimieren (ein gemeinsames Thema in SO).

In einem System wird normalerweise weniger als 100 Prozesse ausgeführt, und selbst wenn es ein paar Tausend hat, sparen Sie nicht viel Zeit.

Trotzdem würde ich vorschlagen, dass Sie alle laufenden Prozesse erhalten und diese Liste mit Ihrer genehmigten Liste im Speicher vergleichen. Jeder Engpass wird wahrscheinlich mit dem Anruf an Windows sein, der nach den Prozessen gefragt wird. Daher wird dies einmal wiederholt von Vorteil sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top