30 Ağustos 2012 Perşembe

C# ile Proccess

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# .NET Framework 4 ile uygulamalarımızdan başka uygulamaları başlatmamızı, yönetmemizi ve hatta onlarla etkileşim kurmamızı sağlayan Process sınıfını yakından inceleyeceğiz. Process sınıfı, işletim sistemi seviyesinde süreçleri (process) kontrol etmek için güçlü bir araçtır. Gelin, Process sınıfının temel özelliklerini, metotlarını ve kullanım senaryolarını birlikte keşfedelim.

Process Sınıfı Nedir?

Process sınıfı, System.Diagnostics ad alanında bulunur ve yerel bir süreç (program veya uygulama) hakkında bilgi sağlamak ve bu süreci kontrol etmek için kullanılır. Bir süreç, işletim sisteminin çalıştırdığı bir programın örneğidir. Process sınıfı sayesinde yeni süreçler başlatabilir, çalışan süreçleri sonlandırabilir, süreçlerin kaynak kullanımını izleyebilir ve hatta süreçlerin standart giriş/çıkış akışlarını yönlendirebiliriz.

Process Sınıfının Temel Özellikleri ve Metotları

İşte Process sınıfının en sık kullanılan özellikleri ve metotları:

Süreç Başlatma ve Kontrol
  • Process.Start(): Yeni bir süreç başlatır. Bu metodun birçok aşırı yüklenmiş (overloaded) versiyonu vardır. En basit haliyle bir uygulama dosyasını veya bir URL'yi açabilir.
  • StartInfo: Bir sürecin nasıl başlatılacağını yapılandıran ProcessStartInfo nesnesini alır. Bu nesne aracılığıyla başlatılacak dosya adı, argümanlar, çalışma dizini, pencere stili ve giriş/çıkış yönlendirmesi gibi ayarlar yapılır.
    • FileName: Başlatılacak uygulamanın veya belgenin adı/yolu.
    • Arguments: Uygulamaya geçirilecek komut satırı argümanları.
    • UseShellExecute: İşletim sisteminin kabuğunu (shell) kullanarak süreci başlatıp başlatmayacağını belirler (true ise dosya ilişkilendirmeleri kullanılır, false ise doğrudan yürütülür).
    • RedirectStandardOutput: Sürecin standart çıktısını yönlendirip yönlendirmeyeceğini belirler.
    • RedirectStandardError: Sürecin standart hata çıktısını yönlendirip yönlendirmeyeceğini belirler.
    • CreateNoWindow: Süreç için yeni bir pencere oluşturup oluşturmayacağını belirler (true ise pencere görünmez).
    • WindowStyle: Sürecin başlangıç pencere stilini belirler (örneğin, Normal, Maximized, Minimized, Hidden).
  • Kill(): Süreci zorla sonlandırır. Bu, sürecin beklenmedik bir şekilde kapanmasına neden olabilir ve kaynakların düzgün serbest bırakılmamasına yol açabilir. Genellikle son çare olarak kullanılır.
  • CloseMainWindow(): Sürecin ana penceresini nazikçe kapatmaya çalışır. Sürecin kendisi kapanmayabilir, sadece penceresi kapanır.
  • WaitForExit(): Çağrı yapan thread'i, sürecin sonlanmasını bekletir. Belirli bir süre (milisaniye) bekletme seçeneği de vardır.
Süreç Bilgileri
  • ProcessName: Sürecin adını alır (örneğin, "notepad", "chrome").
  • Id: Sürecin benzersiz kimliğini (Process ID - PID) alır.
  • MainWindowHandle: Sürecin ana penceresinin tanıtıcısını (handle) alır.
  • MainWindowTitle: Sürecin ana penceresinin başlığını alır.
  • HasExited: Sürecin sonlanıp sonlanmadığını gösteren bir bool özelliğidir.
  • ExitCode: Sürecin sonlanma kodunu alır.
Çalışan Süreçleri Bulma
  • Process.GetProcesses(): Sistemde çalışan tüm süreçlerin bir dizisini (Process[]) döndürür.
  • Process.GetProcessesByName(string processName): Belirtilen ada sahip tüm çalışan süreçlerin bir dizisini döndürür.

Process Kullanım Senaryoları

1. Basit Bir Uygulama Başlatma

Bu örnekte, Not Defteri uygulamasını başlatacağız.

using System;
using System.Diagnostics; // Process için

class ProcessOrnek1
{
    static void Main()
    {
        try
        {
            // Not Defteri uygulamasını başlat
            Process.Start("notepad.exe");
            Console.WriteLine("Not Defteri başlatıldı.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Uygulama başlatılırken hata oluştu: " + ex.Message);
        }
        Console.ReadLine();
    }
}
2. Uygulamayı Argümanlarla Başlatma

Bu örnekte, Not Defteri'ni belirli bir metin dosyasıyla açacağız.

using System;
using System.Diagnostics;
using System.IO; // File.WriteAllText için
using System.Windows.Forms; // Application.StartupPath için

class ProcessOrnek2
{
    static void Main()
    {
        string filePath = Application.StartupPath + "\\test.txt";

        // Test dosyası oluştur
        File.WriteAllText(filePath, "Bu bir test dosyasıdır.\nWebkolog.net");

        try
        {
            // Not Defteri'ni oluşturduğumuz dosya ile başlat
            Process.Start("notepad.exe", filePath);
            Console.WriteLine("Not Defteri '{0}' dosyası ile başlatıldı.", filePath);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Uygulama başlatılırken hata oluştu: " + ex.Message);
        }
        Console.ReadLine();
    }
}
3. Süreci Sonlandırma

Bu örnekte, çalışan bir Not Defteri sürecini bulup sonlandıracağız.

using System;
using System.Diagnostics;
using System.Threading; // Thread.Sleep için

class ProcessOrnek3
{
    static void Main()
    {
        Process notepadProcess = null;
        try
        {
            // Not Defteri'ni başlat
            notepadProcess = Process.Start("notepad.exe");
            Console.WriteLine("Not Defteri başlatıldı. PID: " + notepadProcess.Id);

            // 3 saniye bekle
            Thread.Sleep(3000);

            // Süreci sonlandır
            if (!notepadProcess.HasExited) // Eğer süreç hala çalışıyorsa
            {
                notepadProcess.Kill(); // Süreci zorla sonlandır
                Console.WriteLine("Not Defteri sonlandırıldı.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Süreç yönetilirken hata oluştu: " + ex.Message);
        }
        finally
        {
            if (notepadProcess != null)
            {
                notepadProcess.Dispose(); // Kaynakları serbest bırak
            }
        }
        Console.ReadLine();
    }
}
4. Süreç Çıktısını Yönlendirme (Console Uygulamaları için)

Bir konsol uygulamasının çıktısını yakalamak için RedirectStandardOutput özelliğini kullanabiliriz.

using System;
using System.Diagnostics;
using System.IO;

class ProcessOrnek4
{
    static void Main()
    {
        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe"; // Komut istemcisini başlat
        p.StartInfo.Arguments = "/c dir"; // 'dir' komutunu çalıştır ve çık (/c)
        p.StartInfo.UseShellExecute = false; // Kabuk yürütmesini kullanma
        p.StartInfo.RedirectStandardOutput = true; // Çıktıyı yönlendir
        p.StartInfo.CreateNoWindow = true; // Pencere oluşturma

        try
        {
            p.Start();
            // Sürecin çıktısını oku
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit(); // Sürecin bitmesini bekle

            Console.WriteLine("Komut Çıktısı:\n" + output);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Süreç çalıştırılırken hata oluştu: " + ex.Message);
        }
        finally
        {
            if (p != null)
            {
                p.Dispose();
            }
        }
        Console.ReadLine();
    }
}
5. Çalışan Süreç Bilgilerini Alma

Sistemde çalışan süreçleri listeleyebilir ve onlar hakkında bilgi alabiliriz.

using System;
using System.Diagnostics;

class ProcessOrnek5
{
    static void Main()
    {
        Console.WriteLine("Çalışan Süreçler:");
        Process[] processes = Process.GetProcesses(); // Tüm süreçleri al

        foreach (Process p in processes)
        {
            try
            {
                Console.WriteLine("-------------------------------------");
                Console.WriteLine("PID: " + p.Id);
                Console.WriteLine("İsim: " + p.ProcessName);
                Console.WriteLine("Başlık: " + p.MainWindowTitle);
                Console.WriteLine("Bellek Kullanımı (MB): " + (p.WorkingSet64 / (1024 * 1024)).ToString());
            }
            catch (Exception ex)
            {
                // Bazı süreçlere erişim izni olmayabilir
                Console.WriteLine("Süreç bilgisi alınırken hata: " + ex.Message);
            }
        }
        Console.ReadLine();
    }
}
---

Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile Process sınıfının temel özelliklerini, metotlarını ve kullanım senaryolarını detaylı bir şekilde inceledik. Process sınıfı, uygulamalarınızdan başka programları başlatmak, yönetmek ve onlarla etkileşim kurmak için güçlü bir araçtır. Otomasyon görevleri, sistem yönetimi araçları veya harici uygulamalarla entegrasyon gibi birçok senaryoda bu sınıfın gücünden faydalanabilirsiniz. Umarım bu rehber, C# .NET Framework 4 ile uygulamalar geliştirirken size yardımcı olur. Bir sonraki yazımda, C# dilinin diğer önemli yapı taşlarını keşfetmeye devam edeceğiz. Webkolog.net'i takipte kalın!

Hepinize süreçlerle dolu ve başarılı geliştirme deneyimleri dilerim!

0 yorum:

Yorum Gönder