Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

16 Ekim 2009 Cuma

Delegate ile Thread yaklaşımı.

Sözün Özü
Çünkü bu konuda çok örnek var. Ben sadece iki çok az daha farklı metot ile anlaşılırlığı birazcık daha arttırmak istedim. Ama esas vurgum en alttaki nota olacak. "this.InvokeRequired" herhangi bir delegate (beginInvoke) ile çağırıldığında TRUE olarak set ediliyor. Yani listbox1.InvokeRequired ya da button1.InvokeRequired doğrudan Main Thread den başka bir threade geçilmek isteniyor mu (BeginInvoke call edilmiş mi?) diye bakar. this.InvokeRequired, listbox1.InvokeRequired ya da button1.InvokeRequired ile de geçişi yakalayabilirsiniz.

Olayımız Nedir?

Butonumuz kırmızı ve gri olacak Timer1 nesnemizle her 3 saniyede. Bu arada thread bir for içinde dönecek 1000000... gibi bir sayıya ulaşıncaya kadar listBox1 içine item ekleyeceğiz.
Sonuç aşağıdaki gibi olacak:

Bunu aşağıdaki kodla yapabiliyoruz:


Aşağıdaki kodla da yapabiliyoruz:


NOT:
InvokeRequired required compares the thread ID of the calling
thread to the thread ID of the creating thread.

If these threads are different,it returns true.



namespace wfDelegate
{
public partial class Form1 : Form
{
private delegate void DelYeni();
private DelYeni delYeniBeginInvoke;

private delegate void DelSayListeyeEkle();
private DelSayListeyeEkle delSayEkle;


public Form1()
{
delYeniBeginInvoke = new DelYeni(YeniDelegate);
delSayEkle = new DelSayListeyeEkle(SayListeyeEkle);
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
delSayEkle.BeginInvoke(null, null);
}

void SayListeyeEkle()
{
for (int i = 0; i < 1000000000000; i++)
{
ListeyeEkle(i);
}
}

private bool b;
private void ListeyeEkle(object item)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(
delegate
{
b = this.InvokeRequired;
delYeniBeginInvoke.BeginInvoke(null, null);
listBox1.Items.Add(item);
}));
}
}


void YeniDelegate()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(
delegate
{
button1.Width = 250;
}));
}
}

private void timer1_Tick(object sender, EventArgs e)
{
if (button1.BackColor == Color.Red)
button1.BackColor = Color.DimGray;
else
button1.BackColor = Color.Red;
}
}
}

Hiç yorum yok: