PDA

View Full Version : ارور در برنامه نویسی موازی- چند نخی



gachboy
جمعه 16 اردیبهشت 1401, 13:50 عصر
سلام وقت بخیر ، برای تمرین نخ یک کد ساده نوشتم بنظرتون چرا اجرا نمیشه؟
private void button2_Click(object sender, EventArgs e) {


ThreadStart t1 = new ThreadStart(test);
Thread childThread = new Thread(t1);
childThread.Start();


}


public void test()
{


for (int i = 0; i < 1000; i++)
{
comboBox1.Items.Add("test");
}


}

gachboy
شنبه 17 اردیبهشت 1401, 13:41 عصر
داخل عکس ارور مشخصه ولی اگر بجای کد comboBox1.Items.Add("test") مثلا کد MessageBox.Show("Hello World!") بزارم اروری نمیده و اجرا میشه...
چرا این ارور میده؟
153782

gachboy
شنبه 17 اردیبهشت 1401, 14:00 عصر
داخل یک فروم خارجی خوندم برای رفع ارور از کد زیر استفاده میکردن....
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate


{
//Your code here, like set text box content or get text box contents etc..


}));
}
else
{
// Your code here, like set text box content or get text box contents etc..
// SAME CODE AS ABOVE


}
}

یعنی کلاس من به شکل زیر میشه :
public void test() {


if (InvokeRequired)

{
this.Invoke(new MethodInvoker(delegate


{
for (int i = 0; i < 10; i++)
{
comboBox1.Items.Add("test");
}


}));
}
else
{


}
}

کسی میدونه این کد یعنی InvokeRequired چه کاری انجام میده؟ کلاس بالا برای من کار میکنه ولی قسمت else باید چیزی بنویسم؟
و مهمتر از همه، من میخوام اطلاعات از سورس 3سایت دربیارم،برای گرفتن سورس از http agility pack استفاده کردم و همچنین از ترد برای اینکه فرم برنامم هنگ نکنه...ولی موقع اجرای کد که میخواد چند رشته از بین تگ های سورس سایت دربیاره فرم برنامه هنگ میکنه...چرا هنگ میکنه؟

Mahmoud.Afrad
سه شنبه 20 اردیبهشت 1401, 04:01 صبح
چون ui برنامه به طور مدام مشغول میشه
منطق دریافت و استخراخ رو در نخ مجزا انجام بدید و با invoke ظاهر برنامه رو یک بار و یا با فواصل زمانی آپدیت کنید.
البته

SajjadKhati
پنج شنبه 22 اردیبهشت 1401, 01:36 صبح
داخل عکس ارور مشخصه ولی اگر بجای کد comboBox1.Items.Add("test") مثلا کد MessageBox.Show("Hello World!") بزارم اروری نمیده و اجرا میشه...
چرا این ارور میده؟
153782

سلام
دوستمون جواب دادن .

نکته ی تکمیلی اینکه برای دسترسی به هیچ کنترل و یا اعضای زیر مجموعه اش ، نباید کدهای مربوط به اون کنترل (و یا اعضاش) را درون نخ جدیدی استفاده (فراخونی یا مقداردهی) کنید .

لینک زیر درباره wpf هست اما win form هم خیلی شبیه اش توی این قضیه هست (جواب سومی که با عنوانِ Threading Model in UI شروع میشه) :

C#‎‎ - Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on - Stack Overflow (https://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the)