-
جمعه 07 بهمن 1390, 22:13 عصر
#1
کاربر تازه وارد
جلوگیری از اجرای مجدد یک thread در حال اجرا .
سلام .
من یه thread دارم که دارای یک پارامتر به نام runi هست که وقتی به این runi پارامتر های مختلفی نسبت میدم وظایف مختلفی رو انجام میدن .
حالا فرض کنید با یک دکمه فرمان یک thread با پارامتر runi=A وبا دکمه فرمان دوم یک thread با پارامتر runi=B ایجاد کردم مشکل اینجاست که اگر به هر دلیلی در حالی که ترید runi=A در حال اجراست مجدد دکمه فشرده بشه و دستور اجرای ترید با پاراتر runi=A اعمال بشه برنامه من با ساختاری که داره دچار اشکال میشه . من میخوام تا پایان کار ترید runi A مجدد این ترید با این پارامتر ایجاد نشه .
چکار میتونم بکنم ؟
-
جمعه 07 بهمن 1390, 22:37 عصر
#2
Super Moderator
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
ميتوني با استفاده از متد waitfor ترد اصلي برنامه رو تا مادامي كه كار تردت تموم نشده منتظر نگه داري كه در اين صورت رابط كاربريت فريز ميشه ، ميتوني يك متغيير Boolean تعريف كني و موقع شروع اجراي ترد مقدارش رو مثلا true كني و در پايان كار تردت false ش كني ، تو باقي دكمه هات چك كن اگر متغييرت false اجازه ساخت و اجراي ترد رو بده و در غير اين صورت اجازه ساخت رو نده ، البته راه هاي ديگه اي هم هست ولي پيچيده هستن و مرتبط با مباحث تخصصي Multithreading كه تو پياده سازيشون به مشكل ميخوريد ...
راحت ترين روش همون پياده سازي متغيير ها هست .
-
جمعه 07 بهمن 1390, 23:50 عصر
#3
کاربر تازه وارد
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
متشکرم .
در مورد اون اصطلاح " مباحث تخصص Multithreading " که فرمودید خواستم عرض کنم که من خیلی علاقه مندم این مبحث رو عمیق یاد بگیرم ولی متاسفانه منبع کاملی برای یادگیری پیدا نکردم . اگر احیانا شما منبعی سراغ دارید چه فارسی و چه انگلیسی معرفی کنید خیلی ممنون میشم .
-
شنبه 08 بهمن 1390, 10:25 صبح
#4
کاربر دائمی
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
همين كه گفتن بهترين و سريعترن راه حلته ، استفاده از يك متغيير عمومي براي چك كردن فعاليت يك ترد.
-
شنبه 08 بهمن 1390, 12:28 عصر
#5
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
ممنون از دوستان.
اما با روشی که آقای تاجیک فرمودند. اگه متغیر مقدارش True بود اصلا ترد ساخته نمیشه.
به نظرتون چطوری باید کاری کرد که ترد ساخته بشه و منتظر بمونه و قتی اون متغیره مقدارش False شد. ترد کارش رو شروع کنه. البته ترد ها تو صف باشند. نه اینکه متغیر وقتی False شد یه هویی همه ترد های منتظر شروع به کار کنند.
-
شنبه 08 بهمن 1390, 13:25 عصر
#6
کاربر دائمی
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
خب متغيير را خط اول داخل ترد چك كن و بزار توي يك لوپ كه در حالت استاندارد همون WaitForMultipleObjects يا WaitForSingleObjects هستند استفاده كن
البته مثلا با يك event هم تعريف كني كه بتونه از اين حلقه خارج بشه :)
زياد كار نكردم كه سمپل برات بزارم ولي بگردي توي اينترنت زياد هست.
-
شنبه 08 بهمن 1390, 14:03 عصر
#7
Super Moderator
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
میتونید یک Queue بسازید و نام تردهایی که درخواست اجرا دارند رو درش درج کنید ، پس از پایان کار هر ترد از اول این صف یکی از تردها رو بردارید و متد Execute اون رو اجرا کنید .
-
شنبه 08 بهمن 1390, 14:27 عصر
#8
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
چی هست. میشه یه نمونه بزاری.
-
شنبه 08 بهمن 1390, 14:40 عصر
#9
Super Moderator
نقل قول: جلوگیری از اجرای مجدد یک thread در حال اجرا .
چیز خاصی نیست ، همون صف هست ، میتونید با کلاس های مختلفی مثل TList و ... بسازیدش .
قوانین ایجاد تاپیک در تالار
- شما نمی توانید تاپیک جدید ایجاد کنید
- شما نمی توانید به تاپیک ها پاسخ دهید
- شما نمی توانید ضمیمه ارسال کنید
- شما نمی توانید پاسخ هایتان را ویرایش کنید
-
قوانین سایت