none
2. form üzerinde değişiklik yaparken sorun yaşıyorum. RRS feed

  • Soru

  • Merhabalar,

    Bir method içerisindeki işlemleri Thread içerisine aldım ve işlemler tamamlanırken ekrana farklı bir form(form2 diyelim) açarak Lütfen Bekleyiniz gibi bir yazı yazarak ekranda gösterdim. İşlemler tamamlandığında form2 deki Lütfen bekleyiniz yazısını değiştirmek istediğimde hiç bir şekilde degişiklik olmuyor, Kodlar aşağıdaki gibi,

            private void Progress2()
            {
                PleaseWait pw = new PleaseWait(lblGuardianNameSurname.Text);
                pw.Show();
                Thread thread1 = new Thread(new ThreadStart(Process));
                thread1.Start();
                while (thread1.IsAlive)
                    Application.DoEvents();
                switch (actionTypeId)
                {
                    case 1:
                        pw.Messages(1);
                        break;
                    case 2:
                        pw.Messages(2);
                        break;
                }
                pw.Hide();
            }

    Buda Form2'deki yani Lütfen bekleyiniz yazısı yazan formdaki kodlarım,

            public void Messages(int number)
            {
                if (number == 1)
                {
                    lblwait.Text = "HOŞGELDİNİZ";
                    Thread.Sleep(3000);
                }
                if (number == 2)
                {
                    lblwait.Text = "İYİ GÜNLER";
                    Thread.Sleep(3000);
                }
            }

     
    28 Ekim 2015 Çarşamba 11:54

Yanıtlar

  • private void Progress2()
    {
    	PleaseWait pw = new PleaseWait(lblGuardianNameSurname.Text);
    	pw.Show();
    	pw.Messages(1);
    	Thread thread1 = new Thread(new ThreadStart(Process));
    	thread1.Start();
    	while (thread1.IsAlive)
    		Application.DoEvents();
    	pw.Messages(actionTypeId);
    	Timer t = new Timer() { Interval = 3000 };
    	t.Tick += delegate { pw.Hide(); t.Stop(); };
    	t.Start();
    }


    28 Ekim 2015 Çarşamba 12:44

Tüm Yanıtlar

  • İkinci formun GUI'sinin Thread'i o an çalışmıyordur. 

    Thread.Sleep() Kullanılması guinin çalışmasını tetiklemez, bir butonda ya da başka bir controlde(timer bile) bir yürütme işlemi gerçekleşiyorsa o form onun bitmesini bekler.

    PleaseWait bir form mu ?

    28 Ekim 2015 Çarşamba 12:01
  • Evet PleaseWait bir form. bu formu görüntülüyor fakat aşağıdaki method ile yaptıgım degişiklikleri algılamıyor.

    pw.Messages(1);

    28 Ekim 2015 Çarşamba 12:04
  • hayır algılıyor ama siz görmüyorsunuz. GUI o sırada thread.sleep te. sonrasında da kapatıyorsunuz.

    Şu şekilde yapabilirsiniz. 

    private void Progress2()
    {
    	PleaseWait pw = new PleaseWait(lblGuardianNameSurname.Text);
    	pw.Show();
    	Thread thread1 = new Thread(new ThreadStart(Process));
    	thread1.Start();
    	while (thread1.IsAlive)
    		Application.DoEvents();
    	pw.Messages(actionTypeId);
    	Timer t = new Timer() { Interval = 3000 };
    	t.Tick += delegate { pw.Hide(); t.Stop(); };
    	t.Start();
    }


    28 Ekim 2015 Çarşamba 12:15
  • Verdiğiniz kodu denedim fakat yine HOŞGELDİNİZ yazısını göremedim.
    28 Ekim 2015 Çarşamba 12:39
  • private void Progress2()
    {
    	PleaseWait pw = new PleaseWait(lblGuardianNameSurname.Text);
    	pw.Show();
    	pw.Messages(1);
    	Thread thread1 = new Thread(new ThreadStart(Process));
    	thread1.Start();
    	while (thread1.IsAlive)
    		Application.DoEvents();
    	pw.Messages(actionTypeId);
    	Timer t = new Timer() { Interval = 3000 };
    	t.Tick += delegate { pw.Hide(); t.Stop(); };
    	t.Start();
    }


    28 Ekim 2015 Çarşamba 12:44
  • Bu kodda bir degişiklik yokki yazdığım yazıdada söylediğim gibi işlemler tamamlandıktan sonra HOŞGELDİNİZ yazısı çıkıcak pw.Messages() methodu işlemlerden sonra çalışacak.
    28 Ekim 2015 Çarşamba 12:48
  • Önce hoş geldiniz yazısını gösterip 3 saniye sonra lütfen bekleyiniz mi yapmak istiyorsunuz, ?

    Yapmak istediğiniz şeyin algoritmasını yazın.

    Ben sizin yazdığınız kodun algoritmasını yazıyorum:

    1. pw formunu göster
    2. process methoduna dallanıyor.
    3. process methodunun bitmesi bekleniyor.
    4. pw.setMessage(action type id neyse onu yapar switch case bir işi yok orada)
    5. 3sn bekle

    • zaten dallamanın bitmesini bekliyorsunuz, niye bekliyorsunuz bilmiyoruz ?
    • zaten bir değişken var nereden geldiği belli değil onun sonucuna göre 1(bir) iş yapılıyor. İki iş hiç yok sizin kodda.

    Ne yapmak istediğinizi yazarsanız yardımcı olmaya çalışalım.

    28 Ekim 2015 Çarşamba 13:02
  • Ben sorunu açıkladım ilk yazımda fakat sizinde anlayabilmeniz için tekrar açıklayayım.

    Algoritması ;

    1. Pw formunu göster, (Form üzerindeki Label'da "Lütfen bekleyiniz.." yazısı yazıyor.)

    2. Process methodunu çalıştır ve bitir,(Thread ile)

    3. Pw form üzerindeki label'a "HOŞGELDİNİZ" yaz ve ekranda bunu göster,

    4. Bitir

    Proccess methodunda database'de işlemler yapıyorum ve bu işlemleri yaparken ekranda bu yazıları göstermek istiyorum, ayrıca actionTypeId degişkenin ne geldigi nerden geldigi önemli degil burda if switch case kullanmakta veya kullanmamakta önemli degil, benim yapmak istediğim, Lütfen Bekleyinizz.. yazısını gösterip Process methodunu çalıştırıp bittiğinde ise, Lütfen Bekleyiniz.. yazısını HOŞGELDİNİZ olarak degiştirmek.

    28 Ekim 2015 Çarşamba 13:26
  • actionTypeId'de hata olabilir mi?

    private void Progress2()
    {
    	PleaseWait pw = new PleaseWait(lblGuardianNameSurname.Text);
    	pw.Show();
    	Thread thread1 = new Thread(new ThreadStart(Process));
    	thread1.Start();
    	while (thread1.IsAlive)
    		Application.DoEvents();
    	pw.Messages(1);
    	Timer t = new Timer() { Interval = 3000 };
    	t.Tick += delegate { pw.Hide(); t.Stop(); };
    	t.Start();
    }

    28 Ekim 2015 Çarşamba 13:38
  • actionTypeId'de bir hata olamaz, onu kaldırarakta deniyebiliriz orda sadece parametre geliyor başka birşey yok.
    30 Ekim 2015 Cuma 06:01
  • Bu söylemek istemiyorum ama bende çalışıyor bir hata olmalı

    Şöyle buyurun örnek:

    http://1drv.ms/1RhJT9Y

    30 Ekim 2015 Cuma 06:35
  • Öncelikle Invoke kullanmalısınız bunu belirteyim.

    Eğer .Net 4.5 yada üzerini kullanıyorsanız hiç Thread ile uğraşmayın Task'lar ile rahatlıkla yaparsınız bu işlemi. Aşağıda iki şekilde de örnek veriyorum.

    Thread ile yapımı.

    Form frm1 = new Form();
    var button = new Button(){Text = "Form2 Aç"};
    button.Click+= (sender, args) => 
    {
    	Form frm2 = new Form();
    	var label = new Label();
    	label.Text = "Çalışıyor..";
    	frm2.Controls.Add(label);
    	frm2.Show();
    	Thread tr = new Thread(new ThreadStart(()=>
    	{
    		for (int i = 0; i < 100; i++)
    		{
    			Thread.Sleep(100);			
    			frm2.Invoke(new Action(()=>label.Text = "Yapılıyor.. " + i));
    		}
    	}));
    	tr.Start();
    	while (tr.IsAlive)
    	{
    		Application.DoEvents();
    	}
    	label.Text = "Tamamlandı";
    };
    frm1.Controls.Add(button);
    frm1.ShowDialog();

    Task ile yapımı

    Form frm1 = new Form();
    var button = new Button(){Text = "Form2 Aç"};
    button.Click+= async (sender, args) => 
    {
    	Form frm2 = new Form();
    	var label = new Label();
    	label.Text = "Çalışıyor..";
    	frm2.Controls.Add(label);
    	frm2.Show();
    	Task task = Task.Factory.StartNew(()=>
    	{
    		for (int i = 0; i < 100; i++)
    		{
    			Thread.Sleep(50);			
    			frm2.Invoke(new Action(()=>label.Text = "Yapılıyor.. " + i));
    		}
    	});
    	
    	await task;
    	label.Text = "Tamamlandı";
    };
    frm1.Controls.Add(button);
    frm1.ShowDialog();


    oguzkurtcuoglu.com


    • Yanıt Olarak İşaretleyen Serkan Canseven 30 Ekim 2015 Cuma 14:35
    • Yanıt İşaretini Geri Alan Enes CANSIZ 30 Ekim 2015 Cuma 14:37
    30 Ekim 2015 Cuma 07:13