Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Список процессов

Автор: Unknown 20.03.2008 17:21

С помощью каких компонент можно вывести на экран список работающих процессов?

Автор: volvo 20.03.2008 18:19

Вывести на экран? Да хоть с помощью TextBox-а. Главное этот список получить, а уж отобразить-то не проблема.

P.S. для получения можешь использовать

Process[] processes = Process.GetProcesses(Environment.MachineName);
, а потом пробежаться по всему массиву processes и вытащить оттуда все, что тебе надо...

Автор: klem4 20.03.2008 18:19

Код

using System.Diagnostics;
// ...
Process[] procs = Process.GetProcesses();
foreach (Process curr_proc in procs)
Console.WriteLine(curr_proc.ProcessName);

Автор: Unknown 20.03.2008 19:43

Спасибо большое! буду разбираться

Автор: Unknown 20.03.2008 22:05

Вродь разобрался.
А кто-нибудь знает, как настроить Visual Studio, чтобы она компилировала приложения, запускающиеся на компах, на которых не стоит Visual Studio?

Автор: hardcase 20.03.2008 23:01

Цитата(Unknown @ 20.03.2008 18:05) *
Вродь разобрался.
А кто-нибудь знает, как настроить Visual Studio, чтобы она компилировала приложения, запускающиеся на компах, на которых не стоит Visual Studio?

Если на компе нету VS, то для ручной компиляции проекта тебе потребуется наличие на целевой машине утиллиты MSBuild.exe (поставляется вместе с SDK), с помощю которой можно собрать студийный проект.
Ну и конечно никто не отменял ручную работу с csc.exe (комилятором C#).

В любом случае на машине должен стоять .NET Framework хоть какой-нибудь версии (в идеале не ниже 2.0).

Автор: Unknown 22.03.2008 0:42

Нет, я не хочу компилировать проект на компе без VS - я хочу запускать на нем заранее откомпилированный проект.

Автор: hardcase 22.03.2008 0:59

Цитата(Unknown @ 21.03.2008 20:42) *
Нет, я не хочу компилировать проект на компе без VS - я хочу запускать на нем заранее откомпилированный проект.
На целевой машине должен быть .NET Framework минимум 2.0 версии.

Автор: Unknown 22.03.2008 1:28

Аха, спасибо!

Автор: Unknown 24.03.2008 1:42

Подскажите, пожалуста, как получить пути к исполняемым файлам/процессам!

Автор: hardcase 24.03.2008 4:18

Цитата(Unknown @ 23.03.2008 21:42) *
Подскажите, пожалуста, как получить пути к исполняемым файлам/процессам!
Например вот так:
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.ComponentModel;

namespace ConsoleApplication11 {
    class Program {
        static void Main(string[] args) {
            foreach (Process p in Process.GetProcesses()) {
                Console.WriteLine("process '{0}':", p.ProcessName);
                try {
                    string process_module_name = p.ProcessName.ToLower() + ".exe";
                    foreach (ProcessModule m in p.Modules) {
                        if(m.ModuleName.ToLower() == process_module_name) {
                            Console.WriteLine(" process file: {0}", m.FileName);
                            break;
                        }
                    }
                    
                } catch (Win32Exception) {
                    Console.WriteLine("Can't get file name of process '{0}'", p.ProcessName);
                }
            }
            Console.ReadLine();
        }
    }
}

Проходим по модулям процесса и ищем exe-модуль.

Автор: Unknown 24.03.2008 5:16

ясно! спасибо!

Автор: klem4 24.03.2008 11:56

Код
foreach (Process p in Process.GetProcesses())


Так конечно короче, но чисто теоретически не рискуем ли мы тут получить бесконечный цикл ? Или вызов метода GetProcesses() произойдет только один раз ?

Я к тому что допустим за время каждой итерации в системе появляется еще один процесс, и если GetProcess() получает список процессов каждый раз заново, то цикл может и не завершиться.

Автор: hardcase 24.03.2008 16:27

Цитата(klem4 @ 24.03.2008 7:56) *
Код
foreach (Process p in Process.GetProcesses())


Так конечно короче, но чисто теоретически не рискуем ли мы тут получить бесконечный цикл ? Или вызов метода GetProcesses() произойдет только один раз ?

Вызов метода GetProcesses произойдет один раз.
Для программы
Код
static void Main(string[] args) {
    foreach (Process p in Process.GetProcesses()) {
        Console.WriteLine("process '{0}':", p.ProcessName);
    }
    Console.ReadLine();
}
Компилер сгенерирует следующий код
Код
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       47 (0x2f)
  .maxstack  2
  .locals init ([0] class [System]System.Diagnostics.Process p,
           [1] class [System]System.Diagnostics.Process[] CS$6$0000,
           [2] int32 CS$7$0001)
  IL_0000:  call       class [System]System.Diagnostics.Process[] [System]System.Diagnostics.Process::GetProcesses()
  IL_0005:  stloc.1
  IL_0006:  ldc.i4.0
  IL_0007:  stloc.2
  IL_0008:  br.s       IL_0022
  IL_000a:  ldloc.1
  IL_000b:  ldloc.2
  IL_000c:  ldelem.ref
  IL_000d:  stloc.0
  IL_000e:  ldstr      "process '{0}':"
  IL_0013:  ldloc.0
  IL_0014:  callvirt   instance string [System]System.Diagnostics.Process::get_ProcessName()
  IL_0019:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_001e:  ldloc.2
  IL_001f:  ldc.i4.1
  IL_0020:  add
  IL_0021:  stloc.2
  IL_0022:  ldloc.2
  IL_0023:  ldloc.1
  IL_0024:  ldlen
  IL_0025:  conv.i4
  IL_0026:  blt.s      IL_000a
  IL_0028:  call       string [mscorlib]System.Console::ReadLine()
  IL_002d:  pop
  IL_002e:  ret
} // end of method Program::Main

Как показывает дизассемблер, получение массива происходит один раз - самой первой инструкцией.

Автор: Unknown 8.04.2008 2:46

И еще один вопрос не по теме: можно ли программы, написанные в VS2008, исправлять и перекомпилировывать )) в VS2005?

Автор: klem4 8.04.2008 11:30

Помню была такая проблема в переносом проекта с vs2005->2003 вроде, решалась она созданием нового проекта на 2003 и заменой из него некоторых файлов относящихся к файлам формы из проекта 2005, точно не помню к сожалению, 2 года назад дело было, думаю гугл или яндекс помогут smile.gif

Автор: hardcase 8.04.2008 19:00

Цитата(Unknown @ 7.04.2008 23:46) *
И еще один вопрос не по теме: можно ли программы, написанные в VS2008, исправлять и перекомпилировывать )) в VS2005?
Можно. Но с тем условием, что проекты нацелены на Fw 2.0, а не на 3.0 или 3.5.

Автор: Unknown 11.06.2008 19:04

Необходимо получить число потоков у каждого процесса. Делаю так:

Код
            Process[] procs = Process.GetProcesses();
            foreach (Process curr_proc in procs)
            {
                ProcessThreadCollection threads;
                threads = curr_proc.Threads;
                n = 0;
                foreach (ProcessThread proc_thrd in threads)
                    n++;
                dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value = n;
            }

Это верное решение? Или как можно получить размер массива?

Добавлено через 10 мин.
И еще: необходимо получить для каждого процесса кол-во памяти, которое он занимает. Делаю так:
Код
            Process[] procs = Process.GetProcesses();
            foreach (Process curr_proc in procs)
            {
                n = curr_proc.PrivateMemorySize64 / 1024;
                dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value = n.ToString()+" Kb";
            }

Но значения, которые в рез-те получаются, отличны от тех, что в стандартном Диспетчере Задач... Почему?