PDA

View Full Version : چند سوال در مورد thread ها



.مهدی فهمیده غلامی.
یک شنبه 27 شهریور 1384, 00:24 صبح
سلام
1-چطوری میشه همه thread ها رو در هر وضعیتی که هستند suspedویا abort غیر فعال کرد یا به اصطلاح kill
کرد.؟
2-وقتی یه thread suspend میشه بعد از resume مجددا از همان سر خطی که suspend شده بود به کار ادامه
میده؟ و مقدار متغیر ها هم حفظ میشه برای ادامه اجرا؟
3-چطوری میشه از وضعیت یک thread اطلاع پیدا کرد؟

.مهدی فهمیده غلامی.
یک شنبه 27 شهریور 1384, 20:30 عصر
چطوری میشه یه Thread رو در هر وضعیتی که داره kill کرد؟
مشکل کد زیر چیه؟
[code]
mythread1.Start()
....
....
....
mythread1.suspend()
.....
.....
.....
mythread1.Abort()
[code/]
خطایی که میده:
thread in suspend state ...
من میخوام بدونم چطور میشه این thread رو با اینکه suspend شده نابود کرد؟

یاشار
یک شنبه 27 شهریور 1384, 22:55 عصر
شاید راه حل خیلی خوبی نباشه :



if ( th.ThreadState == ThreadState.Suspended )
{
th.Resume();
}

th.Abort();
th = null;

.مهدی فهمیده غلامی.
دوشنبه 28 شهریور 1384, 16:25 عصر
ممنون
البته من به این نتیجه رسیدم thread ها در دات فریم ورک ذاتا مشکل دار هستند و خطاهای عجیب از اونا
سر میزنه که باید با بلوک try , catch اونو کنترل کرد.

یاشار
دوشنبه 28 شهریور 1384, 17:19 عصر
کلا برنامه نویسی Thread ها کار پیچیده ‌ایه. به خصوص وقتی که Thread ها باید با هم در ارتباط باشند. چون نمی‌تونیم از قبل حدس بزنیم که وقتی Thread کاری رو انجام میده،نرم افزار در چه وضعیتیه.

حالا شما با چه اشکالی برخورد کردید که می‌گید Thread ها در دات نت مشکل دارن ؟ اتفاقا به نظر من استفاده از Thread خیلی راحت تر شده.

aidinwashere
دوشنبه 28 شهریور 1384, 20:49 عصر
یه مثال میشه بزنید که کاربرد این Thread رو نشون بده؟

یاشار
سه شنبه 29 شهریور 1384, 15:04 عصر
مثلا فرض کنید می‌خواهیم بررسی کنیم ببینیم چند عدد بین اعداد 0 تا Max مجموع ارقامشون برابر n هست. مثلا اگر n = 9 باشه، مجموع رقم‌های 81 , 18 , 27 , 72 , 234 و ... همه برابر 9 هست.

ضمنا از راه حل‌های ریاضی و منطقی هم استفاده نمی‌کنیم. می‌خواهیم تک تک اعداد رو امتحان کنیم ببینیم توی این شرط صدق می‌کنن یا نه. این نمونه یک حلقه بلنده که وقت CPU رو زیاد می‌گیره و باعث می‌شه UI قفل کنه. بنابراین بهتره که اعداد رو به چند گروه تقسیم کنیم و هر گروه رو بفرستیم توی یک ترد و آخر سر نتیجه کلی رو به کاربر نشون بدیم. اینطوری UI قفل نمی‌کنه و محاسبات به طور مجزا انجام می‌شن.

برای اینکار یک کلاس شمارنده به نام clsSum ایجاد می‌کنیم و یک Instance از اون رو توی هر ترد اجرا می‌کنیم. توی این مثال تردها با هم در ارتباط نیستند. اگر مشکلمون طوری باشه که احتیاج باشه تردها با هم Sync بشن، یه مقدار کار مشکل و وقت گیر میشه. هر دو روش هم توی مثال به کار رفته. در قسمت بالایی از همون ترد UI استفاده شده و در قسمت پایین از سه ترد جداگانه.

ضمنا شما نگفتید که چه مشکلی داشتید که به این نتیجه رسیدید که Thread ها در دات نت ذاتا مشکل دارند. شاید یه روز به درد ما هم بخوره، اقلا بدونیم تو اون موارد سراغ MultiThreading نریم.