PDA

View Full Version : حذف thread های اجاد شده در برنامه چطوریه؟



combo_ci
دوشنبه 01 مرداد 1386, 10:51 صبح
سلام دوستان

من توی برنامم از چند thread برای لود فرم های برنامم مثل ورود data و...استفاده کردم.....(با vs 2003 ) . وقتی صفحه اصلی برناممو میبندم اگر فرمی که با thread جدا گونه باز شده در حال اجرا باشه بسته نمیشه و توی task manager هم هنوز برنامم لود هستش ....میخوام ببینم چطوری میشه بفهمم که الان چه thread هایی توسط برنامم ایجاد شده و وقتی اینو فهمیدم چطوری اونا رو ببندم.

ممنون.

hdv212
دوشنبه 01 مرداد 1386, 11:48 صبح
از این متد استفاده کن :

threadName.Abort();
موفق باشید.

ARA
دوشنبه 01 مرداد 1386, 17:24 عصر
اینها رو ببین شاید بدردت میخوره
http://barnamenevis.org/forum/showthread.php?t=52569

http://barnamenevis.org/forum/showthread.php?t=67133

combo_ci
سه شنبه 02 مرداد 1386, 08:45 صبح
سلام دوستان

من توی برنامم از چند thread برای لود فرم های برنامم مثل ورود data و...استفاده کردم.....(با vs 2003 ) . وقتی صفحه اصلی برناممو میبندم اگر فرمی که با thread جدا گونه باز شده در حال اجرا باشه بسته نمیشه و توی task manager هم هنوز برنامم لود هستش ....میخوام ببینم چطوری میشه بفهمم که الان چه thread هایی توسط برنامم ایجاد شده و وقتی اینو فهمیدم چطوری اونا رو ببندم.

ممنون.

سوال من یه چیز دیگه بود دوستان.....
من سوالم اینه که از کجا میشه فهمید که چند تا thread تو سط برنامه من ایجاد شده و چطوری اونا رو ببندم؟؟؟؟؟؟؟؟؟؟؟؟؟؟:اشتبا :

ARA
سه شنبه 02 مرداد 1386, 10:40 صبح
وقتی ترد ها رو ایجاد میکنی تو یک آرایه هم بگذارشون
وقتی میخوای برنامه رو ببندی بترتیب همشون رو abort کن

combo_ci
سه شنبه 02 مرداد 1386, 11:07 صبح
وقتی ترد ها رو ایجاد میکنی تو یک آرایه هم بگذارشون
وقتی میخوای برنامه رو ببندی بترتیب همشون رو abort کن

درست شد ممنون

mehdi.mousavi
سه شنبه 02 مرداد 1386, 15:39 عصر
از این متد استفاده کن :

threadName.Abort();موفق باشید.


سلام.
استفاده از Abort به معنی متوقف نمودن صحیح یک Thread نیست. استفاده از Abort معمولا باعث متوقف شدن یه Thread میشه، اما در واقع باعث میشه تا stack اولیه آزاد نشه، DLL های Attach شده مطلع نشن و فرصتی به Thread برای عملیات Clean-up داده نشه. ضمن اینکه handle به object هایی که توسط این thread گرفته شدن هم، تا خاتمه process آزاد نخواهند شد. از این متود فقط و فقط باید در شرایط فوق العاده بحرانی استفاده کرد. متود Abort معادل TerminateThread Win32 API هستش.

اما راه صحیح، باید تابع مربوط به اون thread رو پایان بدید. مثلا وقتی متوجه شدید که باید thread از کار بیفته، باید عملیاتی رو که در حال انجام هست رو متوقف کنید و از تابع خارج بشید. در main thread هم باید با استفاده از متود join، ترد اصلی رو block کنید تا کار تابع مربوطه خاتمه پیدا کنه.

small_programmer
سه شنبه 02 مرداد 1386, 16:44 عصر
دستت درد نکنه فنی و دقیق بود.
ولی یک مطلب برای combo_ci که اگه کد های داخل thread رو درست بنویسی نیازی به Abort کردنشون نداری(البته معمولا)

mehdi.mousavi
سه شنبه 02 مرداد 1386, 17:10 عصر
دستت درد نکنه فنی و دقیق بود.
ولی یک مطلب برای combo_ci که اگه کد های داخل thread رو درست بنویسی نیازی به Abort کردنشون نداری(البته معمولا)


سلام.
دقیقا همینطوره، مشکل اکثریت کسانی که از thread استفاده می کنن این هستش که نمیدونن thread چیه و چطوری باید باهاش کار کرد. ایجاد کردن یه thread و سپردن اون به runtime-library، هیچوقت جزء safe-practice ها نبوده و امروزه هم نیست. (کاری که اکثریت مردم انجام میدن). یا بطور مثال Dispose نکردن Object های GDI (از جمله Font، Brush و ...) و متکی شدن به GC هرگز جزء safe-practice ها نبود و امروزه هم نیست. در صورتیکه بیشتر مثالهای msdn نه به مسائل امنیتی کار توجه می کنن و نه به دقیق بودن مثالها.

طبق آخرین آماری که چندی پیش خوندم، یکی از بیشترین دلائل امنیتی موجود در نرم افزارها این هستش که مثالهای MSDN دقیق و امن نیستند. اونها فقط از جنبه یک مثال ساده نوشته شدن، اما اکثریت اونها رو بعنوان الگو در کدهاشون استفاده می کنن و بعد متوجه بوجود اومدن مسائلی در برنامه میشن که اصلا انتظارشو نداشتن. بهمین دلیل تیمی در Microsoft متعهد شده تا نظارت دقیقی بر مثالهایی که در نسخه های بعدی MSDN نوشته خواهد شد، داشته باشه و حداقل اونها رو از نظر امنیتی چک کنه. احتمالا جریان Abort هم جزء یکی از این مسائل هستش.

امروزه روشهایی وجود داره که بشه کد رو برای استفاده از CPU های HyperThreaded و ... Optimize کرد، اما فهمیدن چنین مسائلی مستلزم درک صحیح مفهوم thread ها و چگونگی کار با اونهاست. ممکنه Abort کردن یک thread هیچوقت باعث بروز مشکلی در برنامه نشه، اما این مساله کاملا اتفاقی و تصادفی هستش و هرگز نباید روی اون حساب باز کرد.

hdv212
سه شنبه 02 مرداد 1386, 19:12 عصر
مشکل اکثریت کسانی که از thread استفاده می کنن این هستش که نمیدونن thread چیه و چطوری باید باهاش کار کرد.

نحوه ی درست کار کردن با Thread رو در لینک زیر بخونید :
http://msdn.microsoft.com/msdnmag/issues/06/03/NETMatters/

mehdi.mousavi
سه شنبه 02 مرداد 1386, 19:53 عصر
نحوه ی درست کار کردن با Thread رو در لینک زیر بخونید :
http://msdn.microsoft.com/msdnmag/issues/06/03/NETMatters/

سلام.
خدا پدر مادرتون رو بیامرزه. این لینک حرف منو برای عدم اسفاده از Abort، تصدیق می کنه. پاراگراف اول رو براتون ترجمه می کنم:

"در مقاله ماه جولای 2005 با عنوان (.NET Matters: StringStream, Methods with Timeouts)، شما به ما نشان دادید که چگونه از Thread.Abort برای کنسل نمودن عملیاتی که مدت زمان زیادی به درازا می انجامد، استفاده کنیم. من می دانم که شما در اعتبار استفاده از این روش به به ما هشدار دادید، اما در شرائط من، گمان می کنم که خطرات احتمالی پذیرفتنی است."

ببینید، به وضوح داره میگه، خطرات احتمالی! و داره میگه که تو مقاله قبلی بهمون هشدار دادین! حالا این شخص تو برنامه اش شرائطی رو داره که میگه اگه خطری هم برنامه رو تهدید کنه، براش اهمیت نداره.

hdv212
سه شنبه 02 مرداد 1386, 20:00 عصر
من فقط شیوه ی صحیح استفاده از Abortable Thread Pool رو گفتم، در ضمن مقاله رو تا آخر بخونید.
من به کسی توهین نکردم، شما عصبانی شدید.

mehdi.mousavi
سه شنبه 02 مرداد 1386, 20:05 عصر
من فقط شیوه ی صحیح استفاده از Abortable Thread Pool رو گفتم، در ضمن مقاله رو تا آخر بخونید.
من به کسی توهین نکردم، شما عصبانی شدید.



:) بالاخره متوجه نشدم شما هنوز میگید استفاده از Abort شیوه درستی هستش؟

hdv212
سه شنبه 02 مرداد 1386, 20:14 عصر
شما گفتی حرف من کاملا غلطه، و abort برای خاتمه دادن به thread نیست، منم گفتم چرا هست، اینم مستندات msdn، ظاهرا برای شما خیلی مهمه که از thread.abort استفاده نکنید. خب نکنید، ولی من همیشه از این تابع استفاده کردم اونم طبق مسندات msdn، به دات نت هم اعتماد داشتم،مشکلی هم پیش نیومده، شاید شما دوست داشته باشی به جای thread.abort، یه کلاسی بنویسی که شامل 6000 خط کد باشه تا این کار رو به صورت safety برات انجام بده.
به هر حال موفق باشید.

ARA
چهارشنبه 03 مرداد 1386, 10:10 صبح
منم با تشکر از زحمات هر دو دوست خوبم میگم که منم بیشتر مواقع از abort استفاده میکنم و تا حالا هیچ مشکلی برام پیش نیمده ولی دونستن یک راه دیگه هم جالبه ، چون از قدیم گفتن :
" چیزی که به خار آید روزی به کار آید "

دوست عزیزم hdv شاید روزی این راه ،مستقیم یا غیر مستقیم به دردت میخوره

از mehdi6755 هم ممنونم، ولی یک کم ملایم تر تا کسی خدای ناکرده احساس نکنه که دارین نظرتون رو تحمیل میکنید

اینجا سایت برنامه نویسه ، و جای مشورت ،کمک ،و در نهایت پیشرفت :لبخندساده:
یا علی

mehdi.mousavi
چهارشنبه 03 مرداد 1386, 20:32 عصر
منم با تشکر از زحمات هر دو دوست خوبم میگم که منم بیشتر مواقع از abort استفاده میکنم و تا حالا هیچ مشکلی برام پیش نیمده ولی دونستن یک راه دیگه هم جالبه ، چون از قدیم گفتن :
" چیزی که به خار آید روزی به کار آید "

دوست عزیزم hdv شاید روزی این راه ،مستقیم یا غیر مستقیم به دردت میخوره
از mehdi6755 هم ممنونم، ولی یک کم ملایم تر تا کسی خدای ناکرده احساس نکنه که دارین نظرتون رو تحمیل میکنید
اینجا سایت برنامه نویسه ، و جای مشورت ،کمک ،و در نهایت پیشرفت :لبخندساده:
یا علی

سلام.
راهی که عرض کردم خدمتتون و مسائلی که مطرح کردم، فراتر از "روزی به کار آید" هستش. بعنوان آخرین تلاش برای اثبات حرفم و اینکه نباید از Abort برای متوقف کردن یک Thread استفاده کرد، سوالی رو در Google Groups در همین ارتباط مطرح کردم، تا دیگران در دنیا به این سوال پاسخ بدن. اونها هم صراحتا جواب مساله رو عنوان کردن و معتقدن که صدا زدن Abort کار صحیحی نیستش. برای خوندن مطلب به این لینک رجوع کنید.
(http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/8f14fd605ed919c3/a44d86a889bd49a3#a44d86a889bd49a3)
ضمنا من چیزی رو به کسی تحمیل نمیکنم، شما آزادانه می تونید به استفاده از Abort ادامه بدید و شاید هم هرگز مشکلی برای شما پیش نیاد. این مساله حقیقتا به من مربوط نمیشه. تمام این تلاشها هم به این دلیل بود که خوانندگان محترم این پست به اشتباه نیفتن.

hdv212
چهارشنبه 03 مرداد 1386, 22:10 عصر
mehdi6755 عزیز، پیشنهاد من به شما اینه که طرح و فکرتون رو به همراه استنادها به صورت FeedBack توی سایت Microsoft ثبت کنید، تا مسولین مربوطه، بررسیهای لازم رو انجام بدن و در صورت مقبولیت حرف شما اون رو در ورژن بعدی دات نت منعکس کنن، نتیجه رو به ما هم اعلام کنید.

در ضمن خیلی بهتر بود که شما پست منو در بخش ارائه پستهای بیهوده و غیر فنی مطرح نمیکردید، و نظر خودتون رو به صورت یه ایده در همین بخش مطرح میکردید.