PDA

View Full Version : سوال: یک نخ ساده...



keyvan_s89
شنبه 18 آذر 1391, 18:33 عصر
سلام میخواستم بپرسم چه جوری میتونم یه نخ بنویسم که مثلا یکیش 1 چاپ کنه و یکیش مثلا 2 چاپ کنه
مرسی.
گشتم چیزی نبود.

r_s1389@yahoo.com
شنبه 18 آذر 1391, 21:39 عصر
سلام جواب سوال شما رو نمیدونم ولی یک مثال از نخ را برای دانلود میگذارم
من هم تا همین حد بلدمhttp://uplod.ir/app00p7xsyuj/Sample.rar.htm

keyvan_s89
یک شنبه 19 آذر 1391, 16:09 عصر
کسی نبود ؟؟؟؟

s3rv3r
یک شنبه 19 آذر 1391, 16:17 عصر
یه نخ بنویسی که یکیش یک چاپ کنه یکیش دو؟
منظورت تعریف دوتا ترد جداست که کارشونم جداسته؟

Thread t1 = new Thread(new ThreadStart(work1));
Thread t2 = new Thread(new ThreadStart(work2));
t1.start();
t2.start();

t1 میره کار اول work1 رو انجام میده و t2 کار دوم رو انجام میده
تابع اول میتونه کارش چاپ عدد 1 یا هرچیزی باشه.
تابع دوم هم میتونه کارش چاپ عدد 2 یا چیزه دیگه باشه

یا حق

rezarko
یک شنبه 19 آذر 1391, 17:14 عصر
یه نخ بنویسی که یکیش یک چاپ کنه یکیش دو؟
منظورت تعریف دوتا ترد جداست که کارشونم جداسته؟

Thread t1 = new Thread(new ThreadStart(work1));
Thread t2 = new Thread(new ThreadStart(work2));
t1.start();
t2.start();

t1 میره کار اول work1 رو انجام میده و t2 کار دوم رو انجام میده
تابع اول میتونه کارش چاپ عدد 1 یا هرچیزی باشه.
تابع دوم هم میتونه کارش چاپ عدد 2 یا چیزه دیگه باشه

یا حق

دوست عزیز میشه یه مثال بزنید

keyvan_s89
یک شنبه 19 آذر 1391, 18:38 عصر
یه نخ بنویسی که یکیش یک چاپ کنه یکیش دو؟
منظورت تعریف دوتا ترد جداست که کارشونم جداسته؟

Thread t1 = new Thread(new ThreadStart(work1));
Thread t2 = new Thread(new ThreadStart(work2));
t1.start();
t2.start();

t1 میره کار اول work1 رو انجام میده و t2 کار دوم رو انجام میده
تابع اول میتونه کارش چاپ عدد 1 یا هرچیزی باشه.
تابع دوم هم میتونه کارش چاپ عدد 2 یا چیزه دیگه باشه

یا حق
میشه یه نخ بنویسی که دوتا کار بکنه ؟
باید تابع رو تو void بنویسیم ؟ یه مثال اگه میشه بزنید لطفا

Y_Safaiee
یک شنبه 19 آذر 1391, 19:26 عصر
سلام دوست من

ساده ترین سمپل کد نرد (این راه ساده ترین راه هست)


using System.Threading;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
new Thread(a1).Start();
new Thread(a2).Start();
}
public void a1()
{
for (int a = 0; a < 10; a++) textBox1.Text += a.ToString();
}
public void a2()
{
for (int a = 0; a < 50; a++) textBox2.Text += a.ToString();
}
}
}



اینم یه نوع دیگش :


using System.Threading;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
Thread thr1 = new Thread(new ThreadStart(a1));
Thread thr2 = new Thread(new ThreadStart(a2));
thr1.Start();
thr2.Start();
}
public void a1()
{
for (int a = 0; a < 10; a++) textBox1.Text += a.ToString();
}
public void a2()
{
for (int a = 0; a < 100; a++) textBox2.Text += a.ToString();
}
}
}



موفق باشی
بایت بایت

keyvan_s89
یک شنبه 19 آذر 1391, 19:29 عصر
سلام دوست من

ساده ترین سمپل کد نرد (این راه ساده ترین راه هست)


using System.Threading;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
new Thread(a1).Start();
new Thread(a2).Start();
}
public void a1()
{
for (int a = 0; a < 10; a++) textBox1.Text += a.ToString();
}
public void a2()
{
for (int a = 0; a < 50; a++) textBox2.Text += a.ToString();
}
}
}



اینم یه نوع دیگش :


using System.Threading;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
Thread thr1 = new Thread(new ThreadStart(a1));
Thread thr2 = new Thread(new ThreadStart(a2));
thr1.Start();
thr2.Start();
}
public void a1()
{
for (int a = 0; a < 10; a++) textBox1.Text += a.ToString();
}
public void a2()
{
for (int a = 0; a < 100; a++) textBox2.Text += a.ToString();
}
}
}



موفق باشی
بایت بایت
میشه این خط رو توضیح بدید
Control.CheckForIllegalCrossThreadCalls = false;

Y_Safaiee
یک شنبه 19 آذر 1391, 19:35 عصر
با سلام مجدد

چون دسترسی و مقدار دهی به بعضی کنترل ها در ترد غیر مجازه (مثل تکسباکس و لیبل ) با استفاده از این کد به سی شارپ میفهمونیم که در صورتی ارور Cross-thread داد به اون توجه نکنه و ادامه کارشو انجام بده.
در صورتی که این کد رو ننویسیم ارور :


Cross-thread operation not valid: Control 'textBox2' accessed from a thread other than the thread it was created on.

خواهد داد.

موفق باشی
بایت بایت

r_s1389@yahoo.com
یک شنبه 19 آذر 1391, 19:48 عصر
آقا اگه کسی در این مورد کتابی دار بذاره تا بقیه هم ازش استفاده کنن

keyvan_s89
یک شنبه 19 آذر 1391, 19:49 عصر
من یه چیزو نمیفهمم خوب چرا از نخ استفاده میکنیم ؟
تو این مثال میشه بدون نخ استفاده از نخ هم کاری کرد که هر دو تکست باکس مقداری بگیرند ؟ میشه یه توضیح بدید ؟

Y_Safaiee
یک شنبه 19 آذر 1391, 20:02 عصر
با سلام مجدد دوست من

دوست خوبم ترد وقتی به کار برده میشه که قراره یه پردازش سنگین اجرا بشه

من تو کد بالا یه For نوشتم و گفتم تا 50 نهایت 100 چاپ کن شما یه بار بی ترد بنویس تا مثلا 100 هزار رو چاپ کن و یه بارم اینو با ترد بنویس:

وقتی بی ترد مینویسی چون پردازش سنگینه فرمت هنگ میکنه و قابل جابجایی نیست و اصطلاحا Not Response میشه اما با ترد فرم شما نه هنگ میکنه,نه Not Response میشه و قابل جابجایی هم هست.

در واقع ترد میاد یه پردازش موازی دیگرو در پس زمینه ایجاد میکنه و شروع به کار میکنه.

مثلا یه بار این کد رو بی ترد بنویس یه بار با ترد :



private void button1_Click(object sender, EventArgs e)
{
Thread thr1 = new Thread(new ThreadStart(a2));
thr1.Start();
}
public void a2()
{
for (int a = 0; a < 100000; a++) textBox2.Text += a.ToString();
}



و اینم بی ترد :


private void button1_Click(object sender, EventArgs e)
{
a2();
}
public void a2()
{
for (int a = 0; a < 100000; a++) textBox2.Text += a.ToString();
}


بعد متوجه گفته من میشه.

موفق باشی
بایت بایت

keyvan_s89
یک شنبه 19 آذر 1391, 20:17 عصر
مرسی کامل فهمیدم.:چشمک:
کار دیگه ای هم میکنه ترد ؟متدی ؟چیزی ؟

Y_Safaiee
یک شنبه 19 آذر 1391, 20:31 عصر
با سلام

آره خیلی کارها میکنه اتفاقا مهمترین کارهام انجام میده,مثلا دیدی وقتی ورد رو باز میکنی چی قشنگ و بی مکث و بدون هنگ باز میشه ,شاید برات جالب باشه بدونی در ورد 100تا ترد دارن در پس زمینه اجرا میشن و اطلاعات رو رد و بدل میکنن.

مثلا یه فایده دیگه ترد ساختن لودینگ برای بارگذاری اطلاعات و داده هاست و نمایش درصد پیشرفت تو پروگرس باره

موفق باشی
بایت بایت

keyvan_s89
سه شنبه 21 آذر 1391, 22:00 عصر
با سلام

آره خیلی کارها میکنه اتفاقا مهمترین کارهام انجام میده,مثلا دیدی وقتی ورد رو باز میکنی چی قشنگ و بی مکث و بدون هنگ باز میشه ,شاید برات جالب باشه بدونی در ورد 100تا ترد دارن در پس زمینه اجرا میشن و اطلاعات رو رد و بدل میکنن.

مثلا یه فایده دیگه ترد ساختن لودینگ برای بارگذاری اطلاعات و داده هاست و نمایش درصد پیشرفت تو پروگرس باره

موفق باشی
بایت بایت
یه سوال
نحوه اولویت دادن یه نخ ها چه جوریه ؟
مثلا اول نخ 2 فعال بشه بعد نخ 1 تو همین مثال که گفتم؟

keyvan_s89
پنج شنبه 23 آذر 1391, 12:48 عصر
کسی نمیدونه ؟