PDA

View Full Version : اجرای چند user control در ترد های مختلف



JBlack
یک شنبه 10 اردیبهشت 1391, 15:49 عصر
سلام

من میخام یک user control که برای ارسال فایل ایجاد کردم رو در برنامه
چند تا ازش ایجاد کنم و هر کدام را در یک ترد اجرا کنم
چطوری می تونم اینکار رو انجام بدم؟

Hossenbor
یک شنبه 10 اردیبهشت 1391, 18:28 عصر
دوسته من چون برای هر کنترلی یک ترد میخواهید پس برای هر کدام جدا تعریف کنید و چونکه از رابط کاربری استفاده می کنید باید از متد INVOKE استفاده کنید

JBlack
یک شنبه 10 اردیبهشت 1391, 22:55 عصر
متشکر
ممکنه یک مثال برام بزنید، من مبتدی هستم
از backgroundWorker میشه استفاده کرد؟

JBlack
دوشنبه 11 اردیبهشت 1391, 02:39 صبح
ممکنه INVOKE رو بیشتر توضیح بدید بامثال
متشکر

JBlack
دوشنبه 11 اردیبهشت 1391, 16:25 عصر
کسی نمیتونه بیشتر راهنمایی کند

Hossenbor
دوشنبه 11 اردیبهشت 1391, 16:56 عصر
دویته عزیز بفرمایین
http://barnamenevis.org/showthread.php?95001-1001-%D9%86%DA%A9%D8%AA%D9%87-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE&p=472866#post472866
و
http://barnamenevis.org/showthread.php?95001-1001-%D9%86%DA%A9%D8%AA%D9%87-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE&p=472893#post472893
و
http://barnamenevis.org/showthread.php?95001-1001-%D9%86%DA%A9%D8%AA%D9%87-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE&p=474172#post474172

JBlack
دوشنبه 11 اردیبهشت 1391, 19:38 عصر
namespace P1
{
public partial class Form2 : Form
{
private Thread Threadx1 = null;
private Thread Threadx2 = null;

public Form1()
{
InitializeComponent();

Threadx1 = new Thread(new ThreadStart(Thread1));
Threadx1.IsBackground = true;

Threadx2 = new Thread(new ThreadStart(Thread2));
Threadx2.IsBackground = true;
}

public void Thread1()
{
textBox1.Text = "A";
}

private void Thread2()
{
textBox1.Text = "B";
}

private void Form2_Load(object sender, EventArgs e)
{
Threadx1.Start();
Threadx2.Start();
}
}
}





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

مشکل کجاست؟
چطوری هر دو ترد رو موازی هم اجرا کنم؟ تا بتونم 2 تا فایل را همزمان UPLOAD کنم؟

cpppro
دوشنبه 11 اردیبهشت 1391, 20:42 عصر
سلام
اول باید یه delegate تعریف کنی.بعد متد مورد نظر رو برای اون بفرستی و از طریق اون عملیات توی ترد اجرا بشه.
کلا برای انجام threading توی ویندوز فرم باید با event ها و delegate ها آشنا باشین.جستجو جو کنین مطالب جامعی هست.
یک مثال.

public delegate void SayHiDelegate(string msg); ////

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

public static string param1 = " \n سلام به جهان \n";

private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(SayHiThread));
t.IsBackground = true;
t.Start();
}

private void SayHiThread()
{
Invoke(new SayHiDelegate(SayHi), new object[] { param1 });
}

private void SayHi(string msg)
{
textBox1.Text += msg;
}
}
}

JBlack
دوشنبه 11 اردیبهشت 1391, 23:16 عصر
اگه بخوام هر User Control در یک ترد اجرا بشه چه گونه میتونم با Invoke فراخوانیش کنم؟

cpppro
سه شنبه 12 اردیبهشت 1391, 08:29 صبح
سلام
همین عملیات بالا رو برای هرکدوم جداگانه تعریف کنین.