26 Ocak 2015 Pazartesi

GUI ve Thread

GUI çatısılarının tamamı tek thread'le çalışırlar. Dolayısıyla arka planda çalışan bir thread'den GUI'yi güncellemek her zaman dikkatli olmayı gerektirir. Aşağıda konuyla ilgili bazı notlarım var.

.Net

WPF
Aşağıdaki örnekler WPF ile ilgili

QueueUserWorkItem metodundan UI thread'e mesaj yollamak
UI Thread'e mesaj yollamak için Dispatcher.Invoke() veya Dispatcher.BeginInvoke() metodlarından birisi kullanılabilir

Burada sorusunda da açıklandığı gibi System.Windows.Threading.Dispatcher.BeginInvoke(Delegate) metodu worker thread içinde çağırılınca UI thread'e bir mesaj yollar. Mesaj UI thread içinde çalıştırılır. Worker thread ise BeginInvoke metodundan sonraki kodu çalıştırmaya devam eder.
Bir başka örnek:

WPF'i Başka Bir Thread İçinde Çalıştırmak
Burada birden fazla WPF Dispatcher threadini başlatma yolu gösteriliyor. Open window inside a thread başlıklı yazı da okumaya değer.

WinForms
Winforms bileşenlerini sadece belli metodları başka bir thread içinde çağırılabilir. Bunlar Invoke(), BeginInvoke(),EndInvoke() ve CreateGraphics() metodlarıdır.

BackgroundWorker
BackgroundWorker yazısına taşıdım.

Thread Sınıfından GUI'ye Mesaj Yollamak
Control sınıfının Invoke metodu kullanılır. Örnek:
public class MyFormControl : Form
{
    public delegate void AddListItem();
   
    public MyFormControl()
    {
        myDelegate = new AddListItem(AddListItemMethod);
    }
    public void AddListItemMethod()
    {
    }
}

public class MyThreadClass
{
    public void Run()
    {
        myFormControl1.Invoke(myFormControl1.myDelegate);
    }
}
Control sınıfı Örnekleri

CheckForIllegalCrossThreadCalls alanı

Bu alana false değeri atanırsa, bir baaşka thread'den GUI'ye erişildi uyarısı alınmaz.


Hiç yorum yok:

Yorum Gönder