PDA

View Full Version : سوال: مشکل در مبحث Threading



peon13
شنبه 25 شهریور 1391, 14:47 عصر
سلام به دوستای گلم

کسی میتونه مشکل این کد رو حل کنه؟

مربوط میشه به مبحث شیرین Threading.

کمک بزرگی میکنید اگه جوابمو بدید. منم به موقع جبران میکنم.:چشمک::قلب::قلب::قلب:

using System;
using System.Net.NetworkInformation;
using System.Threading;

namespace ThreadTest
{
public partial class Form1 : Form
{
Ping NewPing = new Ping();
PingReply NewPingReplay;
Thread NewThread;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
NewThread = new Thread(new ThreadStart(GetPing));
NewThread.Start();
}

private void GetPing()
{
for (int i = 0; i <= 313; i++)
{
NewPingReplay = NewPing.Send("4.2.2.4", 2000);
listView1.Items.Add(NewPingReplay.Status.ToString( ));
}
}
}
}


جان من جواب بدید. آخه این جا کسی جواب سوالات رو نمیده.:ناراحت:

crazyfull
شنبه 25 شهریور 1391, 15:07 عصر
زمانی که شما تابع رو تو يه تريد ديگه صدا ميزنيد نتايج اون رو نميتونيد همينطوری توی فرم برنامتون نمايش بديد يا بايد از invoke استفاده کنی يا اينکه اين تابع رو زمان لود برناماتون False کنيد
CheckForIllegalCrossThreadCalls = false;

البته بهتر اينه که از invoke استفاده کنيد

peon13
شنبه 25 شهریور 1391, 15:34 عصر
زمانی که شما تابع رو تو يه تريد ديگه صدا ميزنيد نتايج اون رو نميتونيد همينطوری توی فرم برنامتون نمايش بديد يا بايد از invoke استفاده کنی يا اينکه اين تابع رو زمان لود برناماتون False کنيد
CheckForIllegalCrossThreadCalls = false;

البته بهتر اينه که از invoke استفاده کنيد

خیلی ممنون.:قلب:

فقط من تا حالا از Invoke استفاده نکردم میشه راهنماییم کنی؟؟؟ و توضیح بدی چی هست. مثلا واسه اون کدی که من دادم چه جوری میشه؟؟؟

بازم ممنون:قلب::قلب::قلب:

peon13
یک شنبه 26 شهریور 1391, 11:39 صبح
یعنی کسی نیست جواب مارو بده؟؟؟:متفکر:

mossaferin
یک شنبه 26 شهریور 1391, 12:07 عصر
سلام
این یه نمونه کد ، وقتی از توی یه thread بخوای یه کنترل روی فرم رو آپدیت کنی
البته روش های دیگه ای هم وجود داره ، استفاده از delegate یا ...
یه سرچ تو اینترنت بزنی نمونه کد زیاده


public void Updatetextbox(string txt)
{
if (!textBox1.InvokeRequired)
{
textBox1.Text += txt + "\r\n";
}
else
{
Invoke(new Action<string>(Updatetextbox), txt);
}
}


موفق باشی

mossaferin
دوشنبه 27 شهریور 1391, 17:54 عصر
سلام
این یه مثال کامل که تستش هم کردم ...

using System;
using System.Net.NetworkInformation;
using System.Threading;
using System.Windows.Forms;

namespace ThreadTest
{
public partial class Form1 : Form
{
Ping NewPing = new Ping();
PingReply NewPingReplay;
Thread NewThread;


public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
NewThread = new Thread(new ThreadStart(GetPing));
NewThread.Start();
}
public void Updatetextbox(string txt)
{
if (!listView1.InvokeRequired)
{
listView1.Items.Add(txt);
}
else
{
Invoke(new Action<string>(Updatetextbox), txt);
}
}
private void GetPing()
{
for (int i = 0; i <= 100; i++)
{
NewPingReplay = NewPing.Send("4.2.2.4", 2000);
Updatetextbox(NewPingReplay.Status.ToString());
Thread.Sleep(1000);
}
}
}
}


موفق باشی

NasrEsk
دوشنبه 27 شهریور 1391, 19:41 عصر
سلام عزیزم.
از بک گراند وورکر استفاده کن.

Sajjad.Aghapour
سه شنبه 28 شهریور 1391, 12:38 عصر
خیلی ممنون.:قلب:

فقط من تا حالا از Invoke استفاده نکردم میشه راهنماییم کنی؟؟؟ و توضیح بدی چی هست. مثلا واسه اون کدی که من دادم چه جوری میشه؟؟؟

بازم ممنون:قلب::قلب::قلب:

وقتی شما یک Thread ایجاد میکنید و یک عمل خاص رو در اون Thread دنبال میکنید باید از Thread Safe بودن اون عمل مطمئن باشید. این به این معناست که کنترل اون عمل دست همون Thread هست که در اون دارید کار می کنید. دسترسی به UI از جمله اعمالی هست که Thread Safe نیست پس نیاز به این خواهد داشت که در Thread خودتون این مسئله رو هندل کنید. یعنی باید چک بشه که کنترل اون Control که میخواهید به اون دسترسی پیدا کنید(در مثال شما listView1) دست همین نخی هست که با کد ایجاد کردید یا نخ اصلی برنامه. شرط InvokeRequired مربوط به کنترل ها این مسئله رو چک خواهد کرد.
مقدار false برای این Property به شما خواهد گفت که دسترسی به این کنترل رو باید از یه Thread دیگه انجام بدید. تابع این Invoke این کار را برای شما انجام خواهد داد به این صورت که تابع شما رو در نخی اجرا خواهد کرد که کنترل این Control رو در دست داره....

البته برای این کار میتونید از SynchronizationContext (http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx)هم استفاده کنید. این لینک (http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I) میتونه به شما کمک کنه

Sajjad.Aghapour
سه شنبه 28 شهریور 1391, 12:40 عصر
سلام عزیزم.
از بک گراند وورکر استفاده کن.

BackgroundWorker یه مقوله جدایی از این مشکل هستش که در اون هم باید این موضوع بررسی بشه و در صورت نیاز هندل بشه...

موفق باشید/