PDA

View Full Version : حرفه ای: multi threading



behnam124
شنبه 25 مهر 1388, 09:35 صبح
سلام به تمام اعضا


همگی خسته نباشید


من یه مشکلی واسم پیدا شده

من میخوام با یه برنامه بنویسم که به صورت چند نخی باشه

مثلا یه قسمت برنامم اعداد 1 تا 10000000 به یه لیست باکس اضافه کنه


و یه قسمت از برنامم بتونه اطلاعاتی از کاربر با تکی باکس بگیره



من خیلی در مورد چند نخی گشتم

و خیلی مطلبم هم پیدا کردم


ولی بازم نتونستم تو فرم ویندوزی این برناممو پیاده سازی کنم


خواهش میکنم اگه کسی یاد داره کمکم کنه

خیلی ازتون ممنونم

mostafa_shaeri_tj
شنبه 25 مهر 1388, 16:47 عصر
چندین تاپیک با این موضوع وجود داره.

چند نخی کردن اینقدرام سخت نیست. باید یک زیر برنامه تعریف کنی . بعد از اون یک شی thread از روی اون زیر برنامه بسازی. با start , abort هم شروع و تموم میشه.




Thread th = new Thread(new ThreadStart(your_procdure));
th.Start();
th.Abort();

behnam124
شنبه 25 مهر 1388, 19:24 عصر
دوسته عزیز من همینو نوشتم ولی چون 2 تا نخ دارم

خطا میده

و نمیتونم برطرفش کنم


تو جاییکه میخوام به لیست باکس اضافه کنم خطا میده


اگه یه نمونه مثال از 2 تا نخ فرم ویندوزی واسم بزاری ممنونت میشم

mostafa_shaeri_tj
شنبه 25 مهر 1388, 20:34 عصر
مشکل شما از دونخی یا چند نخی بودن نیست. مشکل شما باید این کد باشه که ننوشتید. این کد رو توی Form_load فرم تون بنویسید فکر میکنم حل شه :


Form1.CheckForIllegalCrossThreadCalls = fasle;

Amir Oveisi
یک شنبه 26 مهر 1388, 14:47 عصر
مشکل شما از دونخی یا چند نخی بودن نیست. مشکل شما باید این کد باشه که ننوشتید. این کد رو توی Form_load فرم تون بنویسید فکر میکنم حل شه :


کد:
Form1.CheckForIllegalCrossThreadCalls = fasle;

دوست عزیز این کار خیلی درست نیز به نظر من، چون بر اساس خاصیت threat، هر thread فقط به اشیایی دسترسی داره که خودش ایجادش کرده باشه و این هم یک دلیل بسیار مهم داره و اونم اینه که اگر این چنین نبود و هر thread در هر لحظه به همه اشیای برنامه دسترسی داشت، به هیچ وجه نمیشد به مقادیر متغیرها اطمینان کرد چون نمیشه گفت الان کدوم thread فلان متغیر رو تغییر داده و ممکنه طبق پیش بینی ما نباشه ترتیب کار thread ها و همین قضیه بالقوه میتونه فاجعه آفرین باشه!

به همین دلیل هست که thread ها دسترسی محدودی به اشیا دارند و در صورتی که بخوان بدون اجازه به اشیای thread های دیگه دسترسی پیدا کنند، CrossThreadException اتفاق میفته و برنامه نویس رو مطلع میکنه. راه درست برای دسترسی از طریق یک thread به اشیای thread های دیگه اینه که چک کنیم ببینیم میتونیم این کارو انجام بدیم یا نه. برای همین منظور برای کنترل ها یک property در نظر گرفته شده به اسم InvokeRequired که bool هست و اگر مقدار false داشته باشه یعنی الان شما میتونین با thread دیگه ای بهش دسترسی داشته باشید.

برای اطلاعات کامل تر مطلب زیر رو مطالعه بفرمایید:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

موفق باشید

mostafa_shaeri_tj
یک شنبه 26 مهر 1388, 19:55 عصر
حق با شماست. من هم از این موضوع مطلعم . اما چون نمی دونستم که الان Thread نوشته شده ی این دوستمون قراره با چه کنترل هایی کار کنه و حتی خودش هم از ماهیت خطاایی که رخ میداد با خبر نبود، کار رو یکسره کردم و این کد رو پیشنهاد دادم :چشمک:

HoshangiAli
دوشنبه 27 مهر 1388, 17:25 عصر
دوست عزیز thread ها نمی تونن به شی ها دسترسی داشته باشن مثل ListBox شما برای این کار باید از Delegate و Invok استفاده کنی

Mohsen_Fotouhi
سه شنبه 28 مهر 1388, 14:47 عصر
سلام به تمامی دوستان

من قبلا از BackgroundWorker برای این کار استفاده کردم البته بر روی TreeView

براتون یه مثال ضمیمه کردم که داخلش دو تا Button و دو تا TreeView قرار داره در Button

سمت چپ بدون استفاده از BackgroundWorker تعداد زیادی Node رو به TreeVirew با

استفاده از یک حلقه اضافه می کنم که باعث قفل شدن برنامه میشه و در دومی از یک

BackgroundWorker استفاده کردم که بدون قفل شدن برنامه نود ها رو به TreeView اضافه

می کنه فکر کنم بتونه کارتونو راه بندازه

موفق باشید

persianspam
جمعه 16 بهمن 1388, 03:00 صبح
سلام به تمامی دوستان

من قبلا از BackgroundWorker برای این کار استفاده کردم البته بر روی TreeView

براتون یه مثال ضمیمه کردم که داخلش دو تا Button و دو تا TreeView قرار داره در Button

سمت چپ بدون استفاده از BackgroundWorker تعداد زیادی Node رو به TreeVirew با

استفاده از یک حلقه اضافه می کنم که باعث قفل شدن برنامه میشه و در دومی از یک

BackgroundWorker استفاده کردم که بدون قفل شدن برنامه نود ها رو به TreeView اضافه

می کنه فکر کنم بتونه کارتونو راه بندازه

موفق باشید


ممنون از مثال خوبتون.
اگر زحمتی نیست این دو ریداد رو توضیح بدید :

backgroundWorker1_DoWork

backgroundWorker1_ProgressChanged


و اما چند سوال :

1- من برای لیست باکس میخواستم استفاده کنم که اررور داد.
کار این لیست باکی اسن است که با یه دکمه یک فایل متنی رو انتخاب و آیتم ها رو خط به خط وارد این لیست باکس میکنه. اما چون تعداد خط های این فایل متنی زیاد هست برنامه میره تو هنگ !!! آیا میشه برای این کار از backgroundWorker استفاده کرد ؟

اررور :

An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code

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


2 - برای WebBrowser چی ! میشه ؟