PDA

View Full Version : سوال: Sleep کمتر از 1 میلی ثانیه



rezamansori
چهارشنبه 25 مرداد 1391, 04:40 صبح
سلام دوستان
من میخوام در برنامه ای که میسازم در یک حلقه از Sleep استفاده کنم و بعضی وقتا نیاز میشه مدت توقف کمتر از میلی ثانیه باشه.
آیا راه حلی هست؟ سرچ کردم به نتیجه نرسیدم.
اگه میشه کمکم کنید.

the king
چهارشنبه 25 مرداد 1391, 15:51 عصر
سلام دوستان
من میخوام در برنامه ای که میسازم در یک حلقه از Sleep استفاده کنم و بعضی وقتا نیاز میشه مدت توقف کمتر از میلی ثانیه باشه.
آیا راه حلی هست؟ سرچ کردم به نتیجه نرسیدم.
اگه میشه کمکم کنید.

روش دقیقی نمیشه، چون اجرای کد الزاما یکجا و بدون وقفه نیست، فرضا یکصدم میلی ثانیه :

DateTime t = DateTime.Now.AddTicks(TimeSpan.TicksPerMillisecond / 100);
while (t > DateTime.Now) { };

hakim22
چهارشنبه 25 مرداد 1391, 16:07 عصر
توقف کمتر از میلی ثانیه که دیگه توقف نیست !!!

بهتره توضیح بدید چرا نیاز به این قابلیت دارید !؟

rezamansori
چهارشنبه 25 مرداد 1391, 19:36 عصر
مثلا میخواهم در یک لیست 100000 آیتم در مدت 10 ثانیه قرار بدم.
من یک روش دیگه پیدا کردم و اون استفاده از Ticks موجود در StopWatch هست اما مقدار دقیق تیکز در 10 ثانیه رو نمیدونم.
کد زیر رو نوشتم که تعداد تیک ها رو در مدت ده ثانیه برام استخراج کنه که هر دفعه نتیجه متفاوتی میده (البته توی تعداد انگشت شماری تیکز)


using System.Diagnostics;
Stopwatch sw = new Stopwatch();
sw.Start();
while (sw.ElapsedMilliseconds<10000)
{
}
sw.Stop();
MessageBox.Show(sw.ElapsedTicks.ToString());

the king
چهارشنبه 25 مرداد 1391, 21:44 عصر
مثلا میخواهم در یک لیست 100000 آیتم در مدت 10 ثانیه قرار بدم.
من یک روش دیگه پیدا کردم و اون استفاده از Ticks موجود در StopWatch هست اما مقدار دقیق تیکز در 10 ثانیه رو نمیدونم.
کد زیر رو نوشتم که تعداد تیک ها رو در مدت ده ثانیه برام استخراج کنه که هر دفعه نتیجه متفاوتی میده (البته توی تعداد انگشت شماری تیکز)


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

hakim22
چهارشنبه 01 شهریور 1391, 13:14 عصر
خب شما یک Timer میگذارید توی برنامه و Interval اونو روی میلی ثانیه ( عدد 1) تنظیم می کنید. اینطوری در هر ثانیه هزار بار اجرا میشه
اما مسئله اینه که آیا کدی که در هر میلی ثانیه قرار اجرا بشه در همون میلی ثانیه هم تموم میشه یا نه !؟
ممکنه کد شما به هر دلیلی زمان پیشتری برای پردازش نیاز داشته باشه ( میلی ثانیه خیلی کمه) و در بار دومی که تایمر اجرا بشه هنوز فراخوانی بار اول تموم نشده باشه

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

حالت Tick هم بی معنیه چون در ویندوز Proccess ها به صورت نوبتی اجرا میشوند و برنامه چند میلی ثانیه روی هرکدوم تمرکز میکنه و بعد میره سراغ بعدی و اصلا دست شما نیست که کی برگرده سراغ برنامه ی شما که مطمئن باشید در هر رفت و برگشت چند Tick طی شده . در ضمن اگر سخت افزار رایانه هم در این معادله دخالت بدید ویندوز برای انواع CPU ها روش های مختلفی رو پیاده میکنه و حتی در ویندوز های 32 و 64 بیت خیلی چیزها فرق خواهد کرد.

راه حل دوستمون مناسبه یعنی شما از UNmanaged coding استفاده کنید و به سراغ زبانها و کامپایلرهای دیگه برید.