PDA

View Full Version : كار رويه thread



Yasersadegh
سه شنبه 29 اردیبهشت 1388, 13:01 عصر
سلام خدمت دوستان و اساتيد
ديدم اين انجمن فعالتره گفتم مشكلم رو اينجا مطرح كنم!!
توي سي پلاس پلاس چطوري مي تونم يه thread ايجاد كنم و يك تابع را با اين thread اجرا كنم!!؟:متفکر:
به طور كلي كار كردن با threadها چطوريه!!؟:متفکر:
اگه ممكنه اساتيد گرامي كمي توضيح بدهند در اين زمنيه!:لبخندساده:

mehdi.mousavi
سه شنبه 29 اردیبهشت 1388, 14:08 عصر
سلام خدمت دوستان و اساتيد
ديدم اين انجمن فعالتره گفتم مشكلم رو اينجا مطرح كنم!!
توي سي پلاس پلاس چطوري مي تونم يه thread ايجاد كنم و يك تابع را با اين thread اجرا كنم!!؟:متفکر:
به طور كلي كار كردن با threadها چطوريه!!؟:متفکر:
اگه ممكنه اساتيد گرامي كمي توضيح بدهند در اين زمنيه!:لبخندساده:

سلام.
می تونید از یکی از توابع زیر استفاده کنید:



_beginthread
_beginthreadex
CreateThread
CreateRemoteThread
QueueUserWorkItem
...



طبیعتا هر کدوم کاربرد خاص خودشون رو دارن.
برای اطلاعات بیشتر، لطفا به MSDN مراجعه کنید.

Yasersadegh
سه شنبه 29 اردیبهشت 1388, 14:20 عصر
ممنون دوست عزيز
مشكلم رو با create Thread حل كردم.
وضعيت thread رو چطوري مي تونيم بررسي كنيم. يعني ببينيم كار thread تموم شده يانه!!؟:متفکر:

mehdi.mousavi
سه شنبه 29 اردیبهشت 1388, 14:52 عصر
ممنون دوست عزيز مشكلم رو با create Thread حل كردم. وضعيت thread رو چطوري مي تونيم بررسي كنيم. يعني ببينيم كار thread تموم شده يانه!!؟:متفکر:

اوه! نه! این روش صحیح نیست. Thread باید تحت کنترل شما باشه، نه شما تحت کنترل اون! وقتی کار Thread تموم بشه، handle به اون thread بطور خودکار (و توسط ویندوز) Signal خواهد شد. این به این معنی هستش که اگر شما از WaitForSingleObject یا بقیه Wait Function های دیگه استفاده کنید، این توابع متوجه اتمام کار Thread خواهند شد. بسیاری از افراد چون از این مساله مطلع نیستن، از یک event object جداگانه استفاده می کنن، که البته، مطلقا نیازی به این کار نیست.

به بیان ساده تر، شما بر حسب شرایط نرم افزار و منطق کاری، از Thread می خواهید که کار خودش رو متوقف کنه. این خواستن میتونه تحت قالب Signal کردن یک Event Object باشه، یا قرار دادن یک پیام اتمام کار در صفی که Thread در حال پردازش اونه. انتخاب روش، بسته به کاری هستش که Thread انجام میده و Framework ای که برای کارتون در نظر گرفتید. وقتی این درخواست به Thread ارسال شد، Thread باید کار خودش رو متوقف کنه و از تابع مربوطه خارج بشه. لطفا دقت کنید که از چک کردن یا استفاده از مقادیر BOOLEAN برای این کار پرهیز کنید، چون واقعا این کار قاتل CPU هستش و در شرایط Concurrent مشکلات عدیده ای رو می تونه بوجود بیاره.

از طرف دیگه، کسیکه دستور متوقف کردن Thread رو صادر کرده، باید منتظر بمونه تا Handle به اون Thread توسط ویندوز Signal بشه. Signal شدن اون Handle بمعنای اتمام کار Thread خواهد بود، و از اینجا به بعد، هر دوی Thread ها دز یک مسیر به کار خودشون ادامه خواهند داد. (این کار در .NET توسط متود Join انجام میشه، اما اینجا، خودتون باید مراحل رو کنترل کنید).

موفق باشید.

Yasersadegh
سه شنبه 29 اردیبهشت 1388, 16:06 عصر
می تونید از یکی از توابع زیر استفاده کنید:



_beginthread
_beginthreadex
CreateThread
CreateRemoteThread
QueueUserWorkItem



اوه! نه! این روش صحیح نیست.
شما كدوم روش رو پيشنهاد مي كنيد!! يعني كدومش كنترل بيشتري رو به برنامه نويش ميده!!؟

mehdi.mousavi
سه شنبه 29 اردیبهشت 1388, 17:12 عصر
شما كدوم روش رو پيشنهاد مي كنيد!! يعني كدومش كنترل بيشتري رو به برنامه نويش ميده!!؟

فکر میکنم سوء تفاهم شد. من منظورم این نبود که از CreateThread استفاده نکنید! منظور من این بخش از جمله شما بود که گفتید "وضعيت thread رو چطوري مي تونيم بررسي كنيم. يعني ببينيم كار thread تموم شده يانه!!؟"

و الا هر کدوم در جای خودش استفاده میشه. اما هر کدوم رو که انتخاب کنید، باید Thread رو به روشی که توضیح دادم کنترل کنید. (غیر از QueueUserWorkItem که کنترلش دست سیستم عامله)...