PDA

View Full Version : اجرای تسک در ساعت خاص(میلی ثانیه)



sunboymn
سه شنبه 08 مهر 1399, 14:50 عصر
دوستان من روی یک پروژه دارم کار میکنم که یه بخشیش رو میخوام در ساعت 2 شب برحسب میلی ثانیه یک یا چند تسک بصورت همزمان شروع بشه میخوام دقیقا تسک ها سرموقع شروع بشن مثلا ساعت 2:00:00.200، 2:00:00.400، 2:00:00.600 دقیقا سر میلی ثانیه هایی که تعیین کردم انجام بشه حتی اگر تسک ها چند دقیقه طول کشیدن. پرفرومنس هم خیلی مهمه اینکه از منابع مثل cpu بصورت بهینه استفاده بشه. کسی ایده یا نمونه کدی نداره؟ خودم از quartz استفاده کردم ولی شروعش دقیق نبود و نمیدونم چجوری بهش میلی ثانیه بدم خیلی وقته با سی شارپ کار نکردم

the king
سه شنبه 08 مهر 1399, 16:01 عصر
دوستان من روی یک پروژه دارم کار میکنم که یه بخشیش رو میخوام در ساعت 2 شب برحسب میلی ثانیه یک یا چند تسک بصورت همزمان شروع بشه میخوام دقیقا تسک ها سرموقع شروع بشن مثلا ساعت 2:00:00.200، 2:00:00.400، 2:00:00.600 دقیقا سر میلی ثانیه هایی که تعیین کردم انجام بشه حتی اگر تسک ها چند دقیقه طول کشیدن. پرفرومنس هم خیلی مهمه اینکه از منابع مثل cpu بصورت بهینه استفاده بشه. کسی ایده یا نمونه کدی نداره؟ خودم از quartz استفاده کردم ولی شروعش دقیق نبود و نمیدونم چجوری بهش میلی ثانیه بدم خیلی وقته با سی شارپ کار نکردم
این موارد رو در نظر بگیرید:
اولا سیستم عامل ویندوز یک Real-time operating system یا RTOS نیست، برای همین اینکه بخواهید کدی در فلان لحظه اجرا بشه به این معنی نیست که سیستم عامل تمامی پروسه ها و نخ های در حال اجرا رو در اون لحظه متوقف کنه تا کد شما اجرا بشه. بنابر این تاخیر در اجرا با توجه به میزان ترافیک صف پردازه ها و شرایط سیستم غیر قابل اجتناب ئه، گر چه تاخیر اندک باشه.

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

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

رابعا اگر بخواهید کاری تا حد امکان نزدیک به زمان x انجام بشه، بهتره که برای قدری زودتر، مثلا برای 20 ثانیه زودتر از x درخواست اجرا شدن تسک مورد نظر رو بدید و بعد در داخل همون نخ که قراره تسک رو اجرا کنه با یکی دو حلقه به دقت زمان رو بررسی کنید تا لحظه مورد نظر x برسه. اینطوری تاخیر در اجرای تسک رو تا حد زیادی بی تاثیر می کنید. اما با این وجود در نظر بگیرید که پردازنده دائما متعلق به نخ برنامه شما نمیمونه، حتی اگر اولویت اجرای پروسه (Priority) در حالت Realtime باشه. اگر در Task Manager اولویت اجرای Realtime رو می بینید، اون عبارت فریب تون نده، در سیستم عاملی که RTOS نیست Realtime یک مفهوم نسبی است، حقیقتا Realtime نمیشه، صرفا اسمی است برای بالاترین اولویت اجرا.

var x = DateTime.Today.Add(new TimeSpan(0, 2, 0, 0, 200)); // 2:00:00.200
while (x.Subtract(DateTime.Now).TotalSeconds > 1)
{
System.Threading.Thread.Sleep(100);
}
while (x > DateTime.Now)
{
}
// Your task code start here
.
.
.

sunboymn
سه شنبه 08 مهر 1399, 16:48 عصر
ممنون از پاسخگویتون دوست عزیز. این همه بحث تخصصی لازم نبود همه این مواردی که گفتین در شرایطی هستش که cpu مشغول باشه نه اینکه فقط 8تا 10 درصدش مشغول باشه. من یه برنامه تحت ویندوز دیدم که این کار رو انجام میداد به مواردی که گفتین هم بستگی نداشت. تاخیر اجرا هم در حد 1 تا 3 میلی ثانیه داشت! به هرحال ممنون از پاسختون

the king
سه شنبه 08 مهر 1399, 23:11 عصر
ممنون از پاسخگویتون دوست عزیز. این همه بحث تخصصی لازم نبود همه این مواردی که گفتین در شرایطی هستش که cpu مشغول باشه نه اینکه فقط 8تا 10 درصدش مشغول باشه. من یه برنامه تحت ویندوز دیدم که این کار رو انجام میداد به مواردی که گفتین هم بستگی نداشت. تاخیر اجرا هم در حد 1 تا 3 میلی ثانیه داشت! به هرحال ممنون از پاسختون
اون جمله "میخوام دقیقا تسک ها سرموقع شروع بشن" در سوال تون من رو به اشتباه انداخت که میخواهید تسک ها دقیقا سر موقع شروع بشوند، وگرنه اگر می گفتید نمیخوام تسک ها دقیقا سر موقع شروع بشوند و چند میلی ثانیه تاخیر در اجرا ایرادی نداره قضیه فرق می کرد. ساعت 2:00:00.200 با 2:00:00.201 و 2:00:00.202 و 2:00:00.203 چند زمان متفاوت ئه.

sunboymn
چهارشنبه 09 مهر 1399, 01:34 صبح
اون جمله "میخوام دقیقا تسک ها سرموقع شروع بشن" در سوال تون من رو به اشتباه انداخت که میخواهید تسک ها دقیقا سر موقع شروع بشوند، وگرنه اگر می گفتید نمیخوام تسک ها دقیقا سر موقع شروع بشوند و چند میلی ثانیه تاخیر در اجرا ایرادی نداره قضیه فرق می کرد. ساعت 2:00:00.200 با 2:00:00.201 و 2:00:00.202 و 2:00:00.203 چند زمان متفاوت ئه.

بله حق با شماست. من خودم یه چیزایی نوشتم ولی بغد از ون بار اجرا حدودا هفت هشت بار به هم میخوره و تایم هایی که اجرا میشن قاطی میشه. شما راهکاری سراغ ندارین