Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C#’da Single Instance Application

Derlenmiş bir projenin bir bilgisayarda birden fazla uygulama başlatılıyor olması çoğunlukla istenen bir durum değildir. Oluşturduğumuz programın birden fazla uygulamaya izin verdiği duruma “Multiple Instance Applications” denmektedir. Sizlere bu yazıda projemizi “Single Instance Application” modunda ayarlamayı, yani çalışma anında programın tek bir örneğinin oluşturulmasını, eğer program açıksa daha fazla örneğin oluşturulmamasını anlatacağım.

Öncelikle bilmenizi isterim ki, bu işlemi yapan zibilyon teknik varken bu makalemizde bu tekniklerden biri olan “Mutex” sınıfı üzerinden işlemimizi gerçekleştireceğiz.

Varsayalım aşağıdaki program bizim projemiz olsun.

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hoşgeldin Gençay Yıldız...");
            Console.Read();
        }
    }

Bu projenin kaynak kodlarına giderek, “bin” -> “Debug” kombinasyonunu takip edersek eğer ilgili programın .exe uzantılı dosyasına ulaşmış oluyoruz. Bu dosyayı çift tıklayarak açıyorum. Haliyle programımız çalışıyor vaziyette ekranda gözükmektedir. Aynı şekilde bir daha ilgili dosyayı tıklayarak açıyorum ve programımız aşağıdaki ekran görüntüsünde de görüldüğü gibi bir daha açılmaktadır.

C#'da Single Instance Application

C#’da Single Instance Application

İşte şu vaziyette programımız Multiple Instance Applications modunda çalıştığı için aynı anda birden fazla uygulamaya izin vermektedir. Bizim işimiz, eğer programımız açıksa, bir ikincisini engellemektir.

Şimdi aşağıdaki “UygulamaKontrol” ismini verdiğim sınıfı inceleyiniz.

    class UygulamaControl
    {
        static Mutex mtx = null;
        public static bool CalisanVarMi(string CalisanProgramAdi)
        {
            Mutex.TryOpenExisting(CalisanProgramAdi, out mtx);
            if (mtx == null)
            {
                mtx = new Mutex(true, CalisanProgramAdi);
                return true;
            }
            else
            {
                mtx.Close();
                return false;
            }
        }
    }

Siz sınıfı incelerken ben burada yaptığımız işlemi izah etmeye başlayayım. Uygulamamızı Single Instance Application moduna getirebilmek için Mutex sınıfını kullanacağımızdan önceden bahsetmiştik. Gördüğünüz gibi Mutex tipinde static bir “mtx” isminde referans noktası oluşturuyoruz. “CalisanVarMi” isimli metodumuz içerisinde, program önceden açık mı yoksa kapalı mı onu kontrol edeceğiz. Haliyle bu işlemi Mutex.TryOpenExisting metoduyla gerçekleştiriyoruz. Eğer “CalisanProgramAdi” parametresine denk gelen bir uygulama mevcutsa, out tipinden parametre alan 2. parametre alanı “mtx” referansına ilgili uygulamayı gönderecektir. Eğer “mtx” referansı bu işlem neticesinde de “null” olarak dönmüşse demek ki önceden “CalisanProgramAdi” parametresindeki programdan oluşturulmamış anlamına gelmektedir. Demek ki, o an oluşturulan uygulama ilk uygulama olacağı için hemen Mutex nesnesi ilgili referansa tanımlanmakta ve oluşturulacak ilk uygulamaya parametredeki isim verilmektedir.

Artık oluşturulan Mutex nesnesi bir proje ve anahtar kelime tuttuğu için, bundan sonraki çalışmalarda ilgili değeri tarayacak ve o değere sahip uygulama varsa ona göre işlem yapacaktır. Tabi ki de bizim işlemimiz açılmaya yeltenilen programı engellemek olacaktır.

    class Program
    {
        static void Main(string[] args)
        {
            if (!UygulamaControl.CalisanVarMi("CalisanUygulama"))
            {
                return;
            }
            Console.WriteLine("Hoşgeldin Gençay Yıldız...");
            Console.Read();
        }
    }

Gördüğünüz gibi “CalisanVarMi” metodu ile “CalisanUygulama” değerine sahip bir uygulama var mı? yok mu? kontrol ediyor ve ona göre açılmaya çalışılan programı engelliyoruz. Eğer ilk uygulama açılacaksa o uygulamanın Mutex nesnesindeki değeri “CalisanUygulama” değerini alacaktır ve bu isimde bir uygulamanın açık olduğunu gene Mutex nesnesi üzerinden net bir şekilde öğrenebilmekte, ona göre işlemlerimizi gerçekleştirebilmekteyiz.

Hepinize iyi çalışmalar dilerim…
Sonraki yazılarımda görüşmek üzere…

Kaynak : http://www.buraksenyurt.com/post/tek-fotoluk-ipucu-125-single-instance-application.aspx

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Adil dedi ki:

    Salam, Mutex sinifinin ‘TryOpenExisting’ metodu yoxdu

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.