PDA

نسخه کامل مشاهده نسخه کامل : سؤال راجع به thread



CG_
22-05-2008, 00:08
این thread که می گن رو میشه بیشتر توضیح بدین؟ متد sleep اینا هم که می گن بگین لطفاٌ.

بعد تو msdn هم رفتم گشتم، مثال هم داشتاااا، اما چیزی دستگیرم نشد. مرسی

Ultimator
22-05-2008, 12:00
حتما میدونید thread ( ریسمان ) چیه و به چه دردی میخوره . خب برای انجام چند عمل موازی به کار میره اگه چند ریسمانی نبود سیستم عامل میشد داس اگه یه نگاه به تب performance در تسک منیجر بندازین تعداد ریسمان های جاری که توسط cpu در حال پردازشند رو میبینید . ( الان 429 ریسمون تو سیستم من داره اجرا میشه ) .
اگه شما فرضا یه عملیات سنگین دارین که با متد process() اجرا میشه و این عملیات چند ثانیه طول میکشه ( میشه اینو شبیه سازی کرد که تو ادامه میگم ) تا این عملیات انجام نشه و کامل نشه ریسمان جاری قفل میمونه و هیچ چیز دیگه ای تو برناممون نمیتونه از اون ریسمان استفاده کنه . کد زیر رو در نظر بگیرید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
متد سنگین پروسس که مثلا 5 ثانیه طول میکشه 5ثانیه ui برنامه رو قفل میکنه و حتی برنامه به خط بعد نمیره .
اگه ما نخوایم اینطور بشه باید اجرای متد وقت گیر رو به یه ریسمان جدید بسپاریم
اینطوری

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با متد start اون ریسمان جدید رو شروع میکنیم که اون process رو اجرا میکنه
کامپوننت background worker هم همین کار رو میکنه

حالا برای تست فرض کنید یه متد سنگین داریم که 5 ثانیه طول میکشه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این کد ریسمان جاری رو متوقف میکنه . یکی از کاربردهاش همین تست کردنه !! اگه این sleep رو تو همون ریسمان صدا بزنی 5 ثانیه بعد متن لیبل عوض میشه اما اگه یه ریسمان جدید ایجاد کنیم همون لحظه برنامه به خط بعد میره و کد بعدی اجرا میشه .
البته محدودیت هایی هم وجود داره مثلا از ریسمان جدید ( یعنی از داخل متد process ) نمیتونیم متن لیبل بیرون از ریسمان رو تغییر بدیم چون اون لیبل تو یه ریسمان دیگه تعریف شده و برنامه منجر به استثنا میشه .
حالا میتونید برای توضیحات بیشتر به همون تاپیک مراجعه کنید تا کاملتر یاد بگیرید . من در هد سوادم درخدمتم .

CG_
23-05-2008, 00:14
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این کد ریسمان جاری رو متوقف میکنه . یکی از کاربردهاش همین تست کردنه !! اگه این sleep رو تو همون ریسمان صدا بزنی 5 ثانیه بعد متن لیبل عوض میشه اما اگه یه ریسمان جدید ایجاد کنیم همون لحظه برنامه به خط بعد میره و کد بعدی اجرا میشه .
البته محدودیت هایی هم وجود داره مثلا از ریسمان جدید ( یعنی از داخل متد process ) نمیتونیم متن لیبل بیرون از ریسمان رو تغییر بدیم چون اون لیبل تو یه ریسمان دیگه تعریف شده و برنامه منجر به استثنا میشه .
حالا میتونید برای توضیحات بیشتر به همون تاپیک مراجعه کنید تا کاملتر یاد بگیرید . من در هد سوادم درخدمتم .

این از اینجا به بعدشو بیشتر توضیح بدید لطفاً.
منظورم اینه که وقتی میگیم 5000 میلی ثانیه sleep کنه، یعنی فعلاً 5 ثانیه وایسه؟ بعد بقیشو بره؟ اون وقت وقتی 5 ثانیش تموم شد دیگه اون حلقه یا process ـه که فقط اجرا میشه (منظورم اینه که مثل حالت عادیش و بدون thread میشه)؟