PDA

View Full Version : سوال: هنگ کردن برنامه با وجود ترد ها



IMANAZADI
جمعه 28 مهر 1391, 22:00 عصر
برنامه زیر را در نظر بگیرید



namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1 ()
{
InitializeComponent();
}

Thread t1;
Thread t2;

public delegate void dele (int a);
dele nem;



private void button1_Click (object sender , EventArgs e)
{
t1 = new Thread(new ThreadStart(dis));
nem = new dele(chg);
t1.IsBackground = true;
t1.Start();

}

private void dis ()
{
for (int i = 0 ; i < 1000000 ; i++)
{
this.Invoke(nem , i);
}
}

private void chg (int b)
{
listBox1.Items.Add(b);
}


private void button2_Click (object sender , EventArgs e)
{
t2 = new Thread(new ThreadStart(dis2));
nem = new dele(chg2);
t2.IsBackground = true;
t2.Start();
}


private void dis2 ()
{
for (int j = 1000000 ; j < 2000000 ; j++)
{
this.Invoke(nem , j);
}
}


private void chg2 (int b)
{
listBox2.Items.Add(b);
}

private void button3_Click (object sender , EventArgs e)
{
t1.Abort();
}

private void button4_Click (object sender , EventArgs e)
{
t2.Abort();
}
}
}




چرا پس از اجرای برنامه و زدن کلید 1 برنامه بدون هنگ کار میکنه ولی به محض اینکه کلید دوم که باعث شروع ترد دوم میشه برنامه هنگ میکنه

کار این متد چیه ؟؟

t1.IsBackground = true;


آیا ارسال دو متد یا متغییر که در همین مثال هست به یک delegate صحیح هست
ارسال متد chg و متد chg2 به دیلیگیت dele

Mahmoud.Afrad
شنبه 29 مهر 1391, 05:15 صبح
چون هر دو از یک nem استفاده میکنند. بایستی nem = new dele(chg) قبل از حلقه ها باشه. بهتره نامهای متفاوت بدید تا مشکلی بوجود نیاد.
یکی از تردها رو به اندازه 1 میلی ثانیه sleep کنید.
Thread t1,t2;
public delegate void dele(int a);
dele nem1, nem2;
private void button9_Click(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(dis));
t1.Start();
}
private void dis()
{
nem1 = new dele(chg);
for (int i = 0; i < 100000; i++)
{
listBox1.Invoke(nem1, i);
Thread.Sleep(1);
}
}
private void chg(int b)
{
listBox1.Items.Add(b);
}

private void button10_Click(object sender, EventArgs e)
{
t2 = new Thread(new ThreadStart(dis2));
t2.Start();
}
private void dis2()
{
nem2 = new dele(chg2);
for (int j = 100000; j < 200000; j++)
{
listBox2.Invoke(nem2, j);
}
}
private void chg2(int b)
{
listBox2.Items.Add(b);
}