PDA

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



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

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

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



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

th.Abort();
th = null;

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

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

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

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

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

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

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

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

reyhaneh72
یک شنبه 07 دی 1393, 11:41 صبح
سلام.من سوال از ترد داشتم.خیلی حیاتیه.لطفا کمک کنید
میخوام بدونم چطور چند ترد باید منتظر بمونند که کار یک ترد تموم بشه؟؟؟

elec60
یک شنبه 07 دی 1393, 21:40 عصر
سلام.من سوال از ترد داشتم.خیلی حیاتیه.لطفا کمک کنید
میخوام بدونم چطور چند ترد باید منتظر بمونند که کار یک ترد تموم بشه؟؟؟

یک راهش استفاده از کلاس ManualResetEvent هست، من استفاده کردم و خیلی خوب جواب داد. سرچ کنین تا طرز استفاده ش دستتون بیاد

باید از متدهای Reset, Set, WaitOne استفاده کنین...

SabaSabouhi
دوشنبه 08 دی 1393, 12:52 عصر
سلام
مبحث Threadها یکی از مباحث حرفه‌ای در برنامه‌نویسی هست، بهتره قبل از مطالعه و آگاهی کامل ازشون استفاده نکنید. چون خیلی اذیتتون می‌کنه.
ضمن این که فقط جایی از Threadها استفاده کنید که واقعاً لازمه، چون در غیر این صورت فقط کارتون رو سخت کردین.

برای این که یک یا چند رشته منتظر پایان اجرای رشته‌ی دیگه بشن روش‌های مختلفی وجود داره که هر کدوم در شرایط خاصی استفاده می‌شه.
یکی از روش‌ها استفاده از سیگنال هست که دوستمون elec60 بهش اشاره کرده. اما باید به دقت ازش استفاده کنید. استفاده‌ی اشتباه می‌تونه
باعث deadlock بشه. یعنی دو تا رشته منتظر سیگنال از طرف مقابل هستن و این سیگنال هرگز ارسال نخواهد شد.
یه روش دیگه هم بررسی وضعیت رشته‌ی مورد نظر هست. می‌تونید تو یه حلقه Terminate شدن رشته‌ی مورد نظر رو بررسی کنید.

صبا صبوحی

reyhaneh72
شنبه 13 دی 1393, 22:09 عصر
ممنون بابت راهنماییتون..thread هایی که استفاده میکنم باید با فایلا کار کنند...چجور میتونم زمان ثبت اطلاعات در فایل توسط هر ترد رو نشون بدم ب کاربر؟؟

SabaSabouhi
یک شنبه 14 دی 1393, 12:03 عصر
سلام
Threadها نسبت به تداخل خیلی حساس هستن. برای همچنین کارهایی باید از Invoke استفاده کنید.
توی فرمی که قرار هست رویدادها نمایش داده بشن یک متد برای این کار تعریف کنید و در Threadها اون متد رو
با استفاده از Invoke فراخوانی کنید.

صبا صبوحی

reyhaneh72
یک شنبه 14 دی 1393, 15:28 عصر
سلام
Threadها نسبت به تداخل خیلی حساس هستن. برای همچنین کارهایی باید از Invoke استفاده کنید.
توی فرمی که قرار هست رویدادها نمایش داده بشن یک متد برای این کار تعریف کنید و در Threadها اون متد رو
با استفاده از Invoke فراخوانی کنید.

صبا صبوحی
میشه بیشتر توضیح بدید چون من c#درحد مبتدی بلدم