loader
Foto

Processzek használata a C# nyelv segítségével

Egy elég mély, átfogó témának az alapjait kezdjük el most megismerni. A most induló minisorozatunkban megnézzük, hogyan lehet processzeket létrehozni a C# nyelvben, illetve, átnézzük majd a szálak használatának az alapjait is. Ezután aszinkron fogunk metódusokat meghívni, és megismerkedünk a callback-kel is.

Ha elindítjuk a Task Manager-t, akkor az alkalmazásaink neveit, és egyéb különböző adatait láthatjuk (1. ábra). Látjuk a neveket, a process ID-kat (PID), illetve még a szálak számát (Threads) is. 

kep
1. ábra   A Task Manager
 

Készítsünk most egy olyan alkalmazást, amelynek segítségével ezeknek az adatoknak egy részét megjelenítjük, illetve el tudunk indítani (majd leállítani) mi is különböző process-eket.
Indítsuk el a Visual Studio-t és hozzunk létre egy új Console projektet (2. ábra). A projekt neve legyen : ConsoleSzalak.

kep
2. ábra   A projekt létrehozása
 

Ahhoz, hogy tudjunk a C# nyelvben process-ekkel dolgozni, szükségünk lesz a "System.Diagnostics" szerelvényre. Ezt vagy mi írjuk be ("using System.Diagnostics;") vagy pedig beírjuk a "Process"-t, majd a CTRL+. segítségével adjuk hozzá a szerelvényt a projektünkhöz (3. ábra).

kep
3. ábra   A System.Diagnostics szerelvény hozzáadása a projekthez
 

Ezután másojuk be a következő kódot a Program.cs file-ba.

class Program
    {
        static void Main(string[] args)
        {
            Process[] processek = Process.GetProcesses();
            foreach (var item in processek)
            {
                Console.WriteLine("PID: {0}, \t Név: {1}, \t\t\t Szálak : {2}",
                item.Id, item.ProcessName, item.Threads.Count);
            }

            Console.ReadLine();
        }
    }

 

A "processek" nevű, Process típusú gyűjteménybe azok a processzek kerülnek, amelyek a GetProcess() metódus meghívásakor futnak. Ha később listáznánk ki ezt a gyűjteményt a foreach ciklus segítségével, akkor előfordulhat, hogy egy process már véget ért, viszont a "processek" gyűjteményben még ott van. Ekkor futási hiba (kivétel) keletkezik, tehát akkor javasolt a try-catch blokk használata. Mi ettől eltekintettünk.

Indítsuk el az alkalmazásunkat, a futási eredmény a 4. ábrán látható (A \t segítségével tudjuk formázni a megjelenítést.).

kep
4. ábra   A process ID-k, a nevek, illetve a szálak számai
 

Keressünk most rá egy adott nevű process-re. Ehhez a "GetProcessByName()" metódusra lesz szükségünk, amely szintén egy "Process" típusú gyűjteményt ad vissza, hiszen vannak olyan alkalmazások, amelyek ugyanolyan néven futnak, de más PID alatt.
A Main() metódusban lévő változtatást kiemeltük.

class Program
    {
        static void Main(string[] args)
        {
            Process[] processek = Process.GetProcessesByName("chrome");
            foreach (var item in processek)
            {
                Console.WriteLine("PID: {0}, \t Név: {1}, \t\t\t Szálak : {2}",
                item.Id, item.ProcessName, item.Threads.Count);
            }

            Console.ReadLine();
        }
    }

 

Futtassuk újra a programunkat úgy, hogy a "chrome" alkalmazás adatai érdekelnek minket (5. ábra). Látható, hogy a "chrome"-nak különböző PID értékei vannak, tehát a "chrome" alkalmazásunk több process-t használ (és még több szálat....).

kep
5. ábra   Az összes "chrome" nevű alkalmazás főbb adatainak kilistázása

Keressünk rá most egy adott PID-del rendelkező process adataira. Ehhez a "GetProcessById()" metódusra lesz szükségünk. Ez a metódus a "Process" osztályból már nem gyűjteményt ad vissza, ezért a Main() metódusunkat jelentősen módosítottuk.

class Program
    {
        static void Main(string[] args)
        {
            Process process = Process.GetProcessById(7768);

            Console.WriteLine(process.BasePriority);
            Console.WriteLine(process.MachineName);
            Console.WriteLine(process.ProcessName);
            Console.WriteLine(process.SessionId);
            Console.WriteLine(process.UserProcessorTime);
            Console.WriteLine(process.TotalProcessorTime);
            Console.ReadLine();
        }
    }

 

A Main() metódusban kiírjuk a processünk prioritását, azt a gépnevet, ahol fut, a process nevét, a Session Id-ját és a különböző futási időket (6. ábra).

kep
6. ábra   Adott PID-del rendelkező process néhány adatának megjelenítése
 

Végül nézzük meg azt a lehetőséget, hogy hogyan lehet elindítani egy process-t, illetve leállítani. A könnyebb szemléltetés miatt, a létrehozandó process-ben elindítjuk a "notepad.exe"-t, amelyet 2 másodperc múlva leállítunk.
Másoljuk be a "Program.cs" file a következő kódot.

class Program
    {
        static void Main(string[] args)
        {
            Process p1 = Process.Start("notepad.exe");
            Console.WriteLine("Indulás : \t{0} ",p1.StartTime);
            Thread.Sleep(2000);
            p1.Kill();
            Console.WriteLine("Vége : \t\t{0} ", DateTime.Now);
            Console.WriteLine("Prioritás : \t{0} ", p1.BasePriority);
            Console.WriteLine("Process neve : \t{0} ", p1.ProcessName);
            Console.WriteLine("PID : \t\t{0} ", p1.Id);
            
            Console.ReadLine();
        }
    }

 

A Main() metódus első sorával elindítjuk a "notepad"-et egy külön process-ben. Ezután kiírjuk a process-ünk elindulási idejét.
Ezt követően várunk két másodpercet, majd a "Kill()" metódus segítségével leállítjuk a process-t, és a notepad alkalmazásunk is eltűnik (hiszen a process-e véget ért).
Noha a process véget ért, de az adatai elérhetők maradnak továbbra is a Main() metódusban. Kiírjuk még a process "kilővésének" idejét, prioritását, nevét, illetve a PID-et is (7. ábra).

kep
7. ábra   A notepad.exe-t elindító process adatai
 

 



Egyéb cikkek

Mappa

További cikkeink ebben a témakörben

Régebbi cikkeink

Ebben a cikkben bemutatjuk a metódusok alapjait. Nem érintjük viszont például a túlterhelést, ezt egy következő részben tekintjük át.. . . .

Ebben a cikkben megismerjük a C# nyelv által használt változók nagy részét. Nézünk egy példát a típuskonverzióra.. . . .

A sorozatunknak ebben a részében átnézzük általánosságban az osztályok alapjait egy konzolalkalmazás segítségével. A konstruktorok viszont a következő részben kerülnek bemutatásra.. . . .