Помощь - Поиск - Пользователи - Календарь
Полная версия: Список процессов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Unknown
С помощью каких компонент можно вывести на экран список работающих процессов?
volvo
Вывести на экран? Да хоть с помощью TextBox-а. Главное этот список получить, а уж отобразить-то не проблема.

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

using System.Diagnostics;
// ...
Process[] procs = Process.GetProcesses();
foreach (Process curr_proc in procs)
Console.WriteLine(curr_proc.ProcessName);
Unknown
Спасибо большое! буду разбираться
Unknown
Вродь разобрался.
А кто-нибудь знает, как настроить Visual Studio, чтобы она компилировала приложения, запускающиеся на компах, на которых не стоит Visual Studio?
hardcase
Цитата(Unknown @ 20.03.2008 18:05) *
Вродь разобрался.
А кто-нибудь знает, как настроить Visual Studio, чтобы она компилировала приложения, запускающиеся на компах, на которых не стоит Visual Studio?

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

В любом случае на машине должен стоять .NET Framework хоть какой-нибудь версии (в идеале не ниже 2.0).
Unknown
Нет, я не хочу компилировать проект на компе без VS - я хочу запускать на нем заранее откомпилированный проект.
hardcase
Цитата(Unknown @ 21.03.2008 20:42) *
Нет, я не хочу компилировать проект на компе без VS - я хочу запускать на нем заранее откомпилированный проект.
На целевой машине должен быть .NET Framework минимум 2.0 версии.
Unknown
Аха, спасибо!
Unknown
Подскажите, пожалуста, как получить пути к исполняемым файлам/процессам!
hardcase
Цитата(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
ясно! спасибо!
klem4
Код
foreach (Process p in Process.GetProcesses())


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

Я к тому что допустим за время каждой итерации в системе появляется еще один процесс, и если GetProcess() получает список процессов каждый раз заново, то цикл может и не завершиться.
hardcase
Цитата(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
И еще один вопрос не по теме: можно ли программы, написанные в VS2008, исправлять и перекомпилировывать )) в VS2005?
klem4
Помню была такая проблема в переносом проекта с vs2005->2003 вроде, решалась она созданием нового проекта на 2003 и заменой из него некоторых файлов относящихся к файлам формы из проекта 2005, точно не помню к сожалению, 2 года назад дело было, думаю гугл или яндекс помогут smile.gif
hardcase
Цитата(Unknown @ 7.04.2008 23:46) *
И еще один вопрос не по теме: можно ли программы, написанные в VS2008, исправлять и перекомпилировывать )) в VS2005?
Можно. Но с тем условием, что проекты нацелены на Fw 2.0, а не на 3.0 или 3.5.
Unknown
Необходимо получить число потоков у каждого процесса. Делаю так:
Код
            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";
            }

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