PDA

View Full Version : نحوه پیاده سازی یک Thread



sara_aryanfar
دوشنبه 17 مرداد 1390, 02:28 صبح
با سلام دوستان من می خواستم یه مثال برای نحوه پیاده سازی یک thread بزنید البته سرچ کردم اما می خوام اگر بشه یه مثال هم باشه مثلا اگر بخواهیم تعدادی رشته رو با یه threadدر یک listboxاد کنیم چطور باید این کار رو بکنیم

Legend M.A.R
دوشنبه 17 مرداد 1390, 04:30 صبح
باید از Invoke استفاده کنی

private delegate ListViewItem del_AddItem(ListViewItem _Item);

private ListViewItem p_invokeFunctionAddItem(ListViewItem value)
{
ListView1.Items.Add(value);
}

private void p_startThread(ListView _List)
{
del_AddItem g_addItem = new del_AddItem(p_invokeFunctionAddItem);
ListViewItem g_item = new ListViewItem("Hello Guy!!!");
g_item.SubItems.Add("I Add By Invoke");
_List.Invoke(g_addItem,new object[]{g_item});
}

private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Thread g_thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(p_startT hread));

gwbasic
دوشنبه 17 مرداد 1390, 08:03 صبح
می تونید از کامپوننت Backgroundworker استفاده کنید که تو همین سایت آموزشش رو گذاشتم

sara_aryanfar
دوشنبه 17 مرداد 1390, 13:02 عصر
با تشکر اطلا روش پیاده سازی یک Thread چکونه هست مثلا مشکل این کد پائین چی هست

namespace test
{
public partial class Form1 : Form
{
int u;

public Form1()
{
InitializeComponent();
}
private string thh()
{
while (u < 500)
{
u++;
label1.Text = "" + u;
}

}
private void button1_Click(object sender, EventArgs e)
{
Thread a = new Thread(thh);
a.Start();
}
}
}

sara_aryanfar
دوشنبه 17 مرداد 1390, 13:32 عصر
خوب دوستان عزیز من یک ریسمان رو اجرا کردم به این صورت

namespace test
{
public partial class Form1 : Form
{
int u=0;
string m;
public Form1()
{
InitializeComponent();
Form1.CheckForIllegalCrossThreadCalls = false;

}
public void thh()
{
while (u < 500)
{
Thread.Sleep(100);
u++;
m = Convert.ToString(u);
this.label1.Text =""+ m;
}

}
private void button1_Click(object sender, EventArgs e)
{
Thread a = new Thread(new ThreadStart(thh));

a.Start();
}
}
}


اما یادمه یکی از دوستان گفته بود اینطور اجرا کردن مشکل سازه به خاطر این خط کد Form1.CheckForIllegalCrossThreadCalls = false; کسی می دونه چرا؟

gwbasic
دوشنبه 17 مرداد 1390, 14:30 عصر
مشکل اینه که ThreadSafe نیست یعنی شما اجازه دادید که Thread های دیگه به فرم شما دسترسی داشته باشند و بتونن فرم رو تغییر بدن

Legend M.A.R
دوشنبه 17 مرداد 1390, 14:59 عصر
خوب دوستان عزیز من یک ریسمان رو اجرا کردم به این صورت

namespace test
{
public partial class Form1 : Form
{
int u=0;
string m;
public Form1()
{
InitializeComponent();
Form1.CheckForIllegalCrossThreadCalls = false;

}
public void thh()
{
while (u < 500)
{
Thread.Sleep(100);
u++;
m = Convert.ToString(u);
this.label1.Text =""+ m;
}

}
private void button1_Click(object sender, EventArgs e)
{
Thread a = new Thread(new ThreadStart(thh));

a.Start();
}
}
}


اما یادمه یکی از دوستان گفته بود اینطور اجرا کردن مشکل سازه به خاطر این خط کد Form1.CheckForIllegalCrossThreadCalls = false; کسی می دونه چرا؟

دوست عزیز Invoke که گفتم این مشکل رو حل میکنه البته روشی که گفتید هم کار میکنه اما یه جاهایی به مشکل می خورید مثلا فرض کنید یک thread یه thread دیگه رو ایجاد کنه و بخواد به مثلا lable دسترسی داشته باشه اینجا خطا میده و دیگه اون روش جواب نمیده اما Invoke جواب میده

eshpilen
دوشنبه 17 مرداد 1390, 16:54 عصر
ظاهرا نیاز به استفاده از Invoke فقط در Windows Forms هست. درمورد WPF چنین چیزی ندیدم.