PDA

View Full Version : سوال: تایمر دقیق



ZerOne
شنبه 17 مهر 1389, 15:10 عصر
سلام دوستان
توی پروژه ای که دارم کار می کنم نیاز دارم که که قسمتی از کد در فواصل زمانی معیین با دقت میلی ثانیه اجرا بشه از دستور Theard.Sleep() استفاده کردم اما وقتی تو همون تیکه کد دستور Application.DOEvent() رو قرار می دم دیگه دقت لازم رو نداره
همچنین دونبال دستوری هستم که بتونه زمان اجرا یک فطعه کد رو به دقت نانو (یا صد نانو) ثانیه بهم بده

خیلی ممنون میشم که دوستان منو راهنمایی کنند

AmirAmiri
شنبه 17 مهر 1389, 15:38 عصر
سلام دوستان
توی پروژه ای که دارم کار می کنم نیاز دارم که که قسمتی از کد در فواصل زمانی معیین با دقت میلی ثانیه اجرا بشه از دستور Theard.Sleep() استفاده کردم اما وقتی تو همون تیکه کد دستور Application.DOEvent() رو قرار می دم دیگه دقت لازم رو نداره
همچنین دونبال دستوری هستم که بتونه زمان اجرا یک فطعه کد رو به دقت نانو (یا صد نانو) ثانیه بهم بده

خیلی ممنون میشم که دوستان منو راهنمایی کنند
چیزه خیلی سختی خواستی!!
فکر نکنم Clock سیستم بتونه هر نانو ثانیه یک پالس بفرسته.
فکر کنم هر یک میلی ثانیه یک پالس میفرسته.

ZerOne
شنبه 17 مهر 1389, 15:47 عصر
هر نانو ثانیه نه ولی هر صد نانوثانیه می دونم که میشه
سوال اولم چی اونم سخته :چشمک:

AmirAmiri
شنبه 17 مهر 1389, 15:58 عصر
خب برایه چی DoEvent میزاری؟
اگه از Theard استفاده کنی که نیازی به DoEvent نیست. دستور DoEvent معمولا باعث میشه کدهای برنامه کمی کندتر اجرا بشن و فقط برای مواقعی که میخواید برنامه هنگ نکنه خوبه.

Microsoft.net
شنبه 17 مهر 1389, 16:04 عصر
اگر مي خوايي كدت در حد ميلي ثانيه و نانو انجام بشه هيچ وقت از نخ استفاده نكن چون هيچ گارانتي وجود نداره كه كي كدت اجرا بشه. بستگي به اين داره كه cpu چقدر busy باشه چندتا برنامه تو صف پردازش باشن و ... بهترين حالتش استفاده از timer هست كه اونم فكر كنم از 50 ميلي ثانيه كمتر رو پشتيباني نمي كنه.

FastCode
شنبه 17 مهر 1389, 16:05 عصر
فکر کن برنده overclocking توی جهان شدی.
سرعت CPU شما مثلاً 10 GHZ.
ضرب در 10 کن میشه 100 GHZ.
معکوس کن میشه 1 صدم نانو ثانیه.
سیستم عامل 90 درصدش رو به برنامه شما میده.میشه یک نودم نانو ثانیه.
برای اجرای یک procedure کوچولو شما 1000 cpu cycle نیاز داری.
جواب تقریباً میشه چیزی که میخوای.
البته این در صورتیه که سیستم مورد نظر توی نیتروژن مایع باشه و کارت گرافیک هم نداشته باشه.

ZerOne
شنبه 17 مهر 1389, 16:07 عصر
خوب همون می خوام برنامه هنگ نکنه
برای همین ازش استفاده می کنم

فعلا دارم از حلقه فور استفاده می کنم که خیلی دقیق نیست

FastCode
شنبه 17 مهر 1389, 16:13 عصر
اگر مي خوايي كدت در حد ميلي ثانيه و نانو انجام بشه هيچ وقت از نخ استفاده نكن چون هيچ گارانتي وجود نداره كه كي كدت اجرا بشه. بستگي به اين داره كه cpu چقدر busy باشه چندتا برنامه تو صف پردازش باشن و ... بهترين حالتش استفاده از timer هست كه اونم فكر كنم از 50 ميلي ثانيه كمتر رو پشتيباني نمي كنه.

تایمر دقتش خیلی کمتره.
thread این guaranty رو داره که کد شما اجرا میشه(زمانش معلوم نیست)
timer علاوه بر نداشتن تضمین امکان اشتباهات زیادی مثل جا به جا شدن پیغیام ها از بین رفتن یک پیغام و فرستاده شدن یک پیغام جعلی رو هم برای شما به ارمغان میاره.


یک سوال که همینجا برای من پیش اومد:
سرعتی که شما میخواهی بهش برسی کاربرد نظامی داره و تقریباً میتونه یه جاهایی جرم حساب بشه.دقیقاً چکار میخواهی بکنی؟

ZerOne
شنبه 17 مهر 1389, 16:14 عصر
فکر کن برنده overclocking توی جهان شدی.
سرعت CPU شما مثلاً 10 GHZ.
ضرب در 10 کن میشه 100 GHZ.
معکوس کن میشه 1 صدم نانو ثانیه.
سیستم عامل 90 درصدش رو به برنامه شما میده.میشه یک نودم نانو ثانیه.
برای اجرای یک procedure کوچولو شما 1000 cpu cycle نیاز داری.
جواب تقریباً میشه چیزی که میخوای.
البته این در صورتیه که سیستم مورد نظر توی نیتروژن مایع باشه و کارت گرافیک هم نداشته باشه.


برنامه ای که نوشتم داره با سرعت زیر میلی ثانیه کار می کنه
ولی دقیق نیست

ZerOne
شنبه 17 مهر 1389, 16:18 عصر
تایمر دقتش خیلی کمتره.
thread این guaranty رو داره که کد شما اجرا میشه(زمانش معلوم نیست)
timer علاوه بر نداشتن تضمین امکان اشتباهات زیادی مثل جا به جا شدن پیغیام ها از بین رفتن یک پیغام و فرستاده شدن یک پیغام جعلی رو هم برای شما به ارمغان میاره.


یک سوال که همینجا برای من پیش اومد:
سرعتی که شما میخواهی بهش برسی کاربرد نظامی داره و تقریباً میتونه یه جاهایی جرم حساب بشه.دقیقاً چکار میخواهی بکنی؟


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

FastCode
شنبه 17 مهر 1389, 16:22 عصر
با این چیزهایی که میگین من دارم تو شک می افتم :متفکر: بابا من دارم با سرعت میلی ثانیه دستور می دهم ولی دقیق نیست می خوام دقیق باشه
من دارم با این سرعت به یک میکرو از طریق پورت دستور می دم ولی دقیق نیست

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

ZerOne
شنبه 17 مهر 1389, 16:23 عصر
ببینید دوستان این کد زیر هر یک میلی ثانیه داره اجرا می شه


while(true)
{
theard.sleep()
}

ولی با اضافه کردن فقط DOEvent از یک میلی ثانیه به 15 میلی ثانیه سرعتش تغییر می کنه
که من هم باید سرعتم دقیق باشه هم باید از DoEvent برای رفرش فرمم استفاده کنم

babak.h
شنبه 17 مهر 1389, 16:26 عصر
سلام

این حرفی که میزنم شاید بی ربط باشه ولی شاید هم کمک کنه :

به برنامه هایی که زمان اجرای یک قطعه کد یا کل برنامه در آن ها بصورت دقیق قابل پیش بینی و تضمین هست، به اصطلاح برنامه های Real time می گویند.

در واقع اگر بخواهیم دقیق تر صحبت کنیم ، باید به جای برنامه Real time ، بگیم سیستم Real time که شامل نرم افزار + سخت افزار + محیط می شه.

باید در نظر داشته باشید که نه سی شارپ زبان ریل تایمه نه ویندوز سیستم عامل ریل تایمه و نه کامپیوتر های شخصی که ما از اون ها استفاده می کنیم.

منظور این که شما هیچ وقت در یک برنامه سی شارپ نمیتونید با دقت (و حتی بی دقت!) بگید که این متد مثلا 300 میلی ثانیه زمان می بره. چون بستگی به resource های آزاد سیستم و خیلی پارامتر محیطی دیگه داره.

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



موفق باشید

FastCode
شنبه 17 مهر 1389, 16:28 عصر
while(true)
{
theard.sleep()
}
+
DoEvents
متاسفانه دیگه چیز خطرناکی وجود نداره که من اضافه کنم.
شما بدترین اشتباهات رو انجام دادید.
باید از یک ترد استفاده کنید.

ZerOne
شنبه 17 مهر 1389, 16:32 عصر
+
متاسفانه دیگه چیز خطرناکی وجود نداره که من اضافه کنم.
شما بدترین اشتباهات رو انجام دادید.
باید از یک ترد استفاده کنید.

منظورتون اینه که این تکه کدی که میخوام تکرار بشه رو به عنوان یک Thread در نظر بگیرم

ZerOne
شنبه 17 مهر 1389, 16:34 عصر
پس اگر قراره که سیستم شما real time باشه، باید آداب اون رو هم بجا بیارید و اگر نمی خواید یا نمیتونید بجا بیارید، نباید انتظار زیادی از زبان و سیستم عامل و سخت افزارتون داشته باشید چون برای این کار طراحی نشده اند.



موفق باشید

من نمیخوام سیستم real time داشته باشم ولی حداقل باید یک چیزی تو c# باشه که بهتر از حلقه فوری که دارم استفاده کنم عمل کنه

FastCode
شنبه 17 مهر 1389, 16:43 عصر
منظورتون اینه که این تکه کدی که میخوام تکرار بشه رو به عنوان یک Thread در نظر بگیرم

تقریباً یه چیزی توی همین مایه ها.چون من چیزی نفهمیدم.ولی شاید شما چیزی فهمیده باشی.:گیج:

ZerOne
شنبه 17 مهر 1389, 16:50 عصر
ممنون از کمک تون
یه تست بکنم ببینم چی میشه
خوب حالا قسمت دوم سوالم
چطوری می تونم مدت زمان اجرای تکه کد رو به دقت اندازه بگیرم

FastCode
شنبه 17 مهر 1389, 16:51 عصر
ممنون از کمک تون
یه تست بکنم ببینم چی میشه
خوب حالا قسمت دوم سوالم
چطوری می تونم مدت زمان اجرای تکه کد رو به دقت اندازه بگیرم

System.Diagnostics.StopWatch

ZerOne
شنبه 17 مهر 1389, 16:55 عصر
System.Diagnostics.StopWatch

دقتش میلی ثانیه است
چیزی نیست ازش دقیق تر باشه:لبخندساده:

ZerOne
شنبه 17 مهر 1389, 17:03 عصر
فکر کنم به یه جاهایی رسیدم
از ElapsedTicks به جای ElapsedMilliseconds استفاده باید بکنم دقتش بیشتر
فکر کنم دقتش 100 نانو ثانیه باشد
اگه اشتباه می کنم راهنماییم کنید لطفا

ZerOne
شنبه 17 مهر 1389, 17:06 عصر
این Ticks تو سیستم های مختلف فرق دارند؟

ZerOne
شنبه 17 مهر 1389, 17:13 عصر
اینم چیزی که میخواستم


((double )sw.ElapsedTicks/ (double )Stopwatch.Frequency ).ToString();

mohsen_csharp
شنبه 17 مهر 1389, 17:23 عصر
ببینید دوست عزیز کنترل سرعت میزان اجرای کد در زبانی مثل c# با دقت بیشتر از میلی ثانیه بی معنیه.
با DateTime می تونید این اندازه گیری رو انجام بدید ولی
چون زبان c# یک زبان مدیریت شده هست شما هرگز نتایج یکسان بدست نخواهید آورد چون به عنوان مثال شما نمی تونید به کامپایلر بگید که الان عملیات گاربیج کالکشن (جمع آوری زباله ها) رو انجام نده!!!
به فرض شما حساب کردید که یک تکه کد در این کامپیوتر 2ms زمان برده حالا شما موقع اجرای با سخت افزار یا هر چیز دیگه ای ممکنه کامپایلر تصمیم بگیره که عملیات کاربیج کالکشن رو انجام بده که مثلا 50ms زمان ببره
اونوقت تکلیف چیه؟؟؟
من تو مثال های واقعی و عملی به این قضیه برخورد کردم.

ZerOne
شنبه 17 مهر 1389, 17:33 عصر
ببینید دوست عزیز کنترل سرعت میزان اجرای کد در زبانی مثل C#‎ با دقت بیشتر از میلی ثانیه بی معنیه.
با DateTime می تونید این اندازه گیری رو انجام بدید ولی
چون زبان C#‎ یک زبان مدیریت شده هست شما هرگز نتایج یکسان بدست نخواهید آورد چون به عنوان مثال شما نمی تونید به کامپایلر بگید که الان عملیات گاربیج کالکشن (جمع آوری زباله ها) رو انجام نده!!!
به فرض شما حساب کردید که یک تکه کد در این کامپیوتر 2ms زمان برده حالا شما موقع اجرای با سخت افزار یا هر چیز دیگه ای ممکنه کامپایلر تصمیم بگیره که عملیات کاربیج کالکشن رو انجام بده که مثلا 50ms زمان ببره
اونوقت تکلیف چیه؟؟؟
من تو مثال های واقعی و عملی به این قضیه برخورد کردم.

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

یasamin
دوشنبه 26 مهر 1389, 20:39 عصر
سلام ببخشید میون کلامتون وارد شدم راستش من یه عضو جدیدم یعنی داشتم تو گوگل دنبال اطلاعاتی میگشتم که با سایت شما و سوالی که شاید شبیه سوال من بود مواجه شدم به خاطر همین عضو شدم من همه صحبت های شما رو خوندم ولی مشکل اینکه من هیچی بلد نیستم و اصلا نمی دونم اون دستوراتی که نوشتین یعنی چی آخه من تازه سی شارپ شروع کردم من یه آرایه دارم یه بار با bubble sort یه بارم با merge مرتب کردم حالا میخوام ببینم کدومشون سریعتر کار کرده حالا من از اول اول باید چی کار کنم تو رو خدا اگه کوچکترین مطلبی هست که کمک کنه بهم بگین باید پنجشنبه تحویل بدم:ناراحت: تازه کلی گشتم هیجا هیچی نیست تا میگم زمان ,پیچیدگی زمان الگوریتم رو توضیح میدن من میخوام زمان نهایی رو فرم نشون بدم شایدم اصلا نمیشه ,میشه؟

jblaox
چهارشنبه 09 آذر 1390, 11:32 صبح
سلام

یکی میتونه یک مثال ساده از این دستور System.Diagnostics.StopWatch که برای اندازه گیری مدت زمان اجرای برنامه است اینجا قرار بدهد ؟؟

ali_13h
شنبه 12 آذر 1390, 13:03 عصر
شما میتونید از winmm.dll استفاده کنید
دقت اون خیلی بالاست

amirzeini
چهارشنبه 30 خرداد 1397, 16:27 عصر
اینم چیزی که میخواستم


((double )sw.ElapsedTicks/ (double )Stopwatch.Frequency ).ToString();



چی شده؟؟؟؟