PDA

View Full Version : مشکل در ترد ها



angel_boy013
دوشنبه 28 فروردین 1391, 11:09 صبح
سلام دوستان عزیز خسته نباشید
من 1 مشکل مبتدی داشتم برای کار با ترد ها
کد من این هست
توی کد اونجا که کامنت گزاشتم error خطا میده من میخوام دو تا پروگس بار با هم پر شن
ممنون میشم مشکل منو بگید

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace thread
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void bar1()
{
for (int i = 0; i <= 100; i++)
{
progbar.Value = i; // ERROR MIDE INJA
Thread.Sleep(100);
}
}
public void bar2()
{
for (int j = 0; j <= 100; j++)
{
prog2.Value = j;
Thread.Sleep(100);
}
}
private void btnclick_Click(object sender, EventArgs e)
{
//Thread a = new Thread(bar1);
Thread b = new Thread(bar2);
// bar1();
// bar2();
new Thread(bar1).Start();
b.Start();

}



}

}

mazaher5723
دوشنبه 28 فروردین 1391, 14:50 عصر
سلام دوست عزیز
نگاه دوست عزیز شما باید بجای متعییر progbar.value=i از ی متعییر استفاده کنی.

gsearch
دوشنبه 28 فروردین 1391, 15:28 عصر
برای کار با UI توی MiltiThreading شما باید در نظر داشته باشی که تردی که اون کنترل رو ایجاد کرده می تونه اون رو تغییر بده.

بنابراین شما باید یک پیغام به ترد اصلی ارسال کنی و اجرا این عمل رو به خودش واگذار کنی.

برای ارسال پیغام هم معمولا از تابع invoke یا begininvoke استفاده می شه.

برای نمونه می شه اینجوری عمل کرد:

delegate void proplus(ProgressBar sender, int i);

private void setProgress(ProgressBar sender, int i)
{
sender.Value = i;
}

تعریف یه تابع که اجرای اون رو با delegate ارسال شده به متد invoke به ترد اصلی واگذار می کنیم.
بعد در هر ترد متد invoke رو صدا می زنی و کار تموم.

public void bar1()
{

for (int i = 0; i <= 100; i++)
{

//progressBar1.Value = i; // ERROR MIDE INJA
this.Invoke(new proplus(setProgress), new object[] {progressBar1 , i });

Thread.Sleep(100);

}

}

public void bar2()
{

for (int j = 0; j <= 100; j++)
{

//progressBar2.Value = j;
this.Invoke(new proplus(setProgress), new object[] { progressBar2, j});
Thread.Sleep(100);

}

}

private void button1_Click(object sender, EventArgs e)
{
//Thread a = new Thread(bar1);

Thread b = new Thread(bar2);

// bar1();

// bar2();

new Thread(bar1).Start();

b.Start();
}

البته ریزه کاری های دیگه ای هم هست که در کارهای جدی تر باید در نظر گرفت.
به هر حال توی MiltiThreading چالش اصلی شما کار با داده های مشترک است که این مسئله MiltiThreading رو به یکی از سخت ترین مباحث برنامه نویسی تبدیل کرده.
البته توی دات نت تکنولوژی های جدیدی در این زمینه معرفی شدن که بیان اونها در اینجا نمی گنجه و شاید منظور شما هم این موارد نباشه.