PDA

View Full Version : سوال: جلوگیری از اجرای مجدد یک thread در حال اجرا .



تجلی
جمعه 07 بهمن 1390, 22:13 عصر
سلام .
من یه thread دارم که دارای یک پارامتر به نام runi هست که وقتی به این runi پارامتر های مختلفی نسبت میدم وظایف مختلفی رو انجام میدن .

حالا فرض کنید با یک دکمه فرمان یک thread با پارامتر runi=A وبا دکمه فرمان دوم یک thread با پارامتر runi=B ایجاد کردم مشکل اینجاست که اگر به هر دلیلی در حالی که ترید runi=A در حال اجراست مجدد دکمه فشرده بشه و دستور اجرای ترید با پاراتر runi=A اعمال بشه برنامه من با ساختاری که داره دچار اشکال میشه . من میخوام تا پایان کار ترید runi A مجدد این ترید با این پارامتر ایجاد نشه .
چکار میتونم بکنم ؟

Felony
جمعه 07 بهمن 1390, 22:37 عصر
ميتوني با استفاده از متد waitfor ترد اصلي برنامه رو تا مادامي كه كار تردت تموم نشده منتظر نگه داري كه در اين صورت رابط كاربريت فريز ميشه ، ميتوني يك متغيير Boolean تعريف كني و موقع شروع اجراي ترد مقدارش رو مثلا true كني و در پايان كار تردت false ش كني ، تو باقي دكمه هات چك كن اگر متغييرت false اجازه ساخت و اجراي ترد رو بده و در غير اين صورت اجازه ساخت رو نده ، البته راه هاي ديگه اي هم هست ولي پيچيده هستن و مرتبط با مباحث تخصصي Multithreading كه تو پياده سازيشون به مشكل ميخوريد ...

راحت ترين روش همون پياده سازي متغيير ها هست .

تجلی
جمعه 07 بهمن 1390, 23:50 عصر
متشکرم .
در مورد اون اصطلاح " مباحث تخصص Multithreading " که فرمودید خواستم عرض کنم که من خیلی علاقه مندم این مبحث رو عمیق یاد بگیرم ولی متاسفانه منبع کاملی برای یادگیری پیدا نکردم . اگر احیانا شما منبعی سراغ دارید چه فارسی و چه انگلیسی معرفی کنید خیلی ممنون میشم .

joker
شنبه 08 بهمن 1390, 10:25 صبح
همين كه گفتن بهترين و سريعترن راه حلته ، استفاده از يك متغيير عمومي براي چك كردن فعاليت يك ترد.

Mask
شنبه 08 بهمن 1390, 12:28 عصر
ممنون از دوستان.
اما با روشی که آقای تاجیک فرمودند. اگه متغیر مقدارش True بود اصلا ترد ساخته نمیشه.
به نظرتون چطوری باید کاری کرد که ترد ساخته بشه و منتظر بمونه و قتی اون متغیره مقدارش False شد. ترد کارش رو شروع کنه. البته ترد ها تو صف باشند. نه اینکه متغیر وقتی False شد یه هویی همه ترد های منتظر شروع به کار کنند.

joker
شنبه 08 بهمن 1390, 13:25 عصر
خب متغيير را خط اول داخل ترد چك كن و بزار توي يك لوپ كه در حالت استاندارد همون WaitForMultipleObjects يا WaitForSingleObjects هستند استفاده كن
البته مثلا با يك event هم تعريف كني كه بتونه از اين حلقه خارج بشه :)
زياد كار نكردم كه سمپل برات بزارم ولي بگردي توي اينترنت زياد هست.

Felony
شنبه 08 بهمن 1390, 14:03 عصر
میتونید یک Queue بسازید و نام تردهایی که درخواست اجرا دارند رو درش درج کنید ، پس از پایان کار هر ترد از اول این صف یکی از تردها رو بردارید و متد Execute اون رو اجرا کنید .

Mask
شنبه 08 بهمن 1390, 14:27 عصر
یک Queue بسازید
چی هست. میشه یه نمونه بزاری.

Felony
شنبه 08 بهمن 1390, 14:40 عصر
چیز خاصی نیست ، همون صف هست ، میتونید با کلاس های مختلفی مثل TList و ... بسازیدش .