تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 8 از 8

نام تاپيک: زمانبندی کردن اجرا ی خاص توابع

  1. #1
    آخر فروم باز
    تاريخ عضويت
    Jul 2009
    پست ها
    6,351

    پيش فرض زمانبندی کردن اجرا ی خاص توابع

    سلام

    شاید بشه گفت من هیچی گیر نیوردم
    بستگی سرچ زدم . گوگل هم که داغونه نتایج جاهای دیگه هم زیاد جالب نیست.
    میخوام فلان تابع رو که اسمش مثلا Test هست . حالا به واسطه ترد که مخصوص خودش داره.
    بگم شما 4 ثانیه اجرا بشو و تمام.
    ترد 2 مثلا 14 ثانیه اجرا بشو و هر چی میتونی مثلا یک پیغام تو این 14 ثانیه بده خروجی بعد دیگه تمام
    یا suspend بشه. کلا دیگه قدرت اجرایی نداشته باشه تا وقتی ما نخواهیم.
    فکر کنم باید راه حل ابتکاری داشته باشیم چون تابعی ندیدم

  2. #2
    داره خودمونی میشه iKode's Avatar
    تاريخ عضويت
    Mar 2013
    محل سكونت
    ایـــــــــــــــران
    پست ها
    34

    پيش فرض

    همچین تابعی نیست شما می تونید یه ترد و اجرا بزارید بعد از 4 ثانیه اون ترد و معلق و یکی دیگه رو بزارید تابعی اینچنینی براش وجود نداره حالا برای چی میخوایی اینطوری بشه؟

  3. این کاربر از iKode بخاطر این مطلب مفید تشکر کرده است


  4. #3
    آخر فروم باز
    تاريخ عضويت
    Jul 2009
    پست ها
    6,351

    پيش فرض

    همچین تابعی نیست شما می تونید یه ترد و اجرا بزارید بعد از 4 ثانیه اون ترد و معلق و یکی دیگه رو بزارید تابعی اینچنینی براش وجود نداره حالا برای چی میخوایی اینطوری بشه؟

    سلام
    میخوام روش الگوریتم های سیتسم عامل پیاده کنم.
    نیاز هست یک ترد بهش یک زمانی اختصاص بدیم و بگیم فلان تابع رو چند ثانیه اجرا کن یا تمام بشه برای همیشه کار اون ترد یا بمونه با وقتی بهش بگیم دوباره بقیه اجرا کنه

  5. #4
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    همانطورکه دوستمان اشاره کردند میتوانید از متدهای Suspend و Resume جهت توقف موقتی و ادامه به کار مجدد ریسمان استفاده کنید.
    از متدهایی مانند Abort هم میتوانید جهت توقف اجباری ریسمان استفاده کنید (چیزی شبیه EndTask)

    دیگر نمیدانم به چه چیزی اضافه ای برای کارتان نیاز دارید...

  6. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  7. #5
    آخر فروم باز
    تاريخ عضويت
    Jul 2009
    پست ها
    6,351

    پيش فرض

    سلام
    همانطورکه دوستمان اشاره کردند میتوانید از متدهای Suspend و Resume جهت توقف موقتی و ادامه به کار مجدد ریسمان استفاده کنید.
    از متدهایی مانند Abort هم میتوانید جهت توقف اجباری ریسمان استفاده کنید (چیزی شبیه EndTask)

    دیگر نمیدانم به چه چیزی اضافه ای برای کارتان نیاز دارید...
    سلام.
    ممنون از شما
    مشکل زمان است.
    چطور بگم مثلا 4 ثانیه اجرا بشه بعد sus یا abort بشه. این زمانبندی کردنش اذیت میکنه.
    میشه مثالی برای ما بزارید تا بفهمیم ؟ ممنونم

  8. #6
    کاربر فعال تالار .Net Msba's Avatar
    تاريخ عضويت
    Dec 2006
    محل سكونت
    ! My Mind
    پست ها
    506

    پيش فرض

    کافیست تا یکم ریزتر به سیستم عامل نگاه کنید.
    یک cpu هشت بیتی مربوط به سال 1990 رو در نظر بگیرید. نه یک i7 هشت هسته ای!.
    خوب اگر این cpu می خواست که یک OS داشته باشد چه می شد؟
    خیلی ساده. یک تایمر داشت که زمان رو براش اندازه می گرفت و بعد از اینکه زمان تمام می شد می رفت تابع بعدیش رو اجرا می کرد. دوباره که زمان تمام می شد به همین ترتیب. یعنی در یک نگاه ریز تر:
    1-زمان آغاز می گردد.
    2- دستورات اول اجرا می شود.
    3- زمان تمام می شود.
    4-وضعیت دستورات اول می رود در stack
    5-دستورات دوم اجرا می شود.
    6-زمان تمام می شود.
    .
    .
    .
    .
    n- وضعیت دستورات اول از stack برداشته می شود.
    n+1- دستورات اول اجرا می شود.
    n+2 - زمان تمام می شود.
    .
    .
    .
    .
    خوب رسیدیم به قیامت!
    پس برای برنامه نویسیش هم کافیه تا حداقل یک تایمر جهت اندازه گیری زمان داشته باشید. این تایمر ها در CPU ها با SysTickTimer شناخته می شوند. که رابطه مستقیمی با زمان دارند.( در برخی از CPU ها از RTC جهت Systick استفاده می شود.)

    خوب تکلیف زمان بندی مشخص شد حالا کافیه تا دستورات متوقف و اجرا بشن.
    به این کد دقت کنید:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    اگر مشکلی در نمایش داشته دوباره اجرا کنید.(احساس می کنم این عمل مربوط به بافر Console باشد.)

    در مثال بالا من یک اولویت بالا برای Thread شماره 1 ایجاد کردم. با این کار این Thread دوبرابر Thread های دیگر اجرا می شود.(البته این بسته به تنظیمات const های شما داره اما با این تنظیمات 2برابر هست.)
    در اینجا اصلا ما چیزی رو stack نکردیم. چرا؟
    چون ما از thread ها خارج نشدیم. بلکه آن ها را متوقف کردیم. این در واقع کاری است که ما به کمک OS اصلی انجام دادیم.اگر می خواستیم از این ویژگی OS صرفه نظر کنیم می بایست یک کلاس stack تعریف و وضعیت شمارش گر thread که همان i باشد رو push کنیم(قرار دادن درstack). آنگاه می شد Thread ها را abort کرد و سپس با واکشی استک(POP) اون Thread رو به حالت قبل برگردوند.
    استفاده از suspend و resume توصیه نمی شود. اما اینجا مثال را ساده تر می کرد.
    اگر می خواستیم از این دو متد استفاده نکنیم یک semaphore می توانست شبیه ساز کاملا یک cpu تک هسته ای تا n هسته ای برا ما باشد. این کار کمی مثال را پیچیده تر می کرد.

    کد بسیار ساده عمل می کند. با یک debug ساده می توان رفتار آن را فهمید اما برای نتیجه کلی نباید در حالت debug بود.(use: CTRL+F5)چرا؟ چون debug همزمانی thread ها را خراب می کند.

    موفق باشید.

  9. 2 کاربر از Msba بخاطر این مطلب مفید تشکر کرده اند


  10. #7
    آخر فروم باز
    تاريخ عضويت
    Jul 2009
    پست ها
    6,351

    پيش فرض

    سلام
    بسیار بسیار از زحماتت ممنون. فقط آیا در این کد امکان داره من شی بسازم که یک عدد به عنوان میلی ثانیه بهش بدم و بره اون قدر اجرا بشه؟
    یا تابع داشته باشیم؟

    امکان هست لطف کنید توضیح دهید از نحوه کار؟ واقعا ممنون و شرمنده میشیم

  11. #8
    کاربر فعال تالار .Net Msba's Avatar
    تاريخ عضويت
    Dec 2006
    محل سكونت
    ! My Mind
    پست ها
    506

    پيش فرض

    توضیح کد با توجه به مدت زمان اجرا:

    شما priority های مختلف تعیین کنید و برای هر اولویت یک زمان اجرای مشخص. در کد بالا من فقط سطح 0 رو نوشتم که خودتون می تونید گسترشش بدید.
    آلان همین وضعیت ها این طوری هست که هر یک ثانیه روند اجرا به یک Thread دیگه منتقل می شه به غیر از اونی که اولویت 0 رو داره که دوثانیه اجرا می شه.
    توضیح:
    هر تیک در 50 میلی ثانیه.
    هر 20 تیک = تغییر روند به ریسمان دیگر.
    اگر سطح اولویت های متفاوت تعریف شود می شود که هر کدام چند Tick با زمان 50 میلی ثانیه اجرا شوند.

    شما زمان هر تیک رو بگذارید 10 میلی ثانیه. تغییر تیک رو هم از 20 به 5 تغییر دهید. آنگاه هر Thread هر 50 میلی ثانیه تغییر خواهد کرد. و اولویت صفر با این وضعیت 100 میلی ثانیه زمان اجرا دارد و مابقی همان 50 میلی ثانیه.


    فقط آیا در این کد امکان داره من شی بسازم که یک عدد به عنوان میلی ثانیه بهش بدم و بره اون قدر اجرا بشه؟
    یا تابع داشته باشیم؟
    م
    برای این کار داستان کاملا متفاوت هست. شما در کلاس جدیدی که می سازید یک Thread و یک StopWatch تعریف کنید. Thread را استارت کنید.کرنموتر رو نیز همین طور. یک متغیر Volatile از نوع bool بسازید که نمایانگر اتمام تابع Thread شما باشد. در همان Thread که instance کلاس اصلی شما باشد که یک حلفه مدت زمان سپری شده و اتمام کار Thread را بررسی کند. اگر زمان گذشت و Thread تمام نشد آن را Abort کنید.

    موفق باشید.

  12. این کاربر از Msba بخاطر این مطلب مفید تشکر کرده است


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •