PDA

View Full Version : واقعی نبودن زمان Interval در timer



m110_110
شنبه 12 دی 1388, 14:46 عصر
با سلام
مي بخشيد من اين سوال رو در تالار wpf پرسيدم ولي خوب كسي جوابم رو نداد
و از اونجايي كه اين مشكل رو مي شد اينجاهم عنوان كرد ذكر كردم تا انشاالله بشه يك جوابي براش پيدا كرد
شرمنده

من یک برنامه دارم می نویسم که به دقت timer بستگی زیادی دارد
در طول برنامه Interval آن هر چند لحظه باید تغییر کند (طبق پارامترهایی)
اما در حین کار متوجه مشکلی شدم و اون اینکه Interval که به اون می دم دقیقا اون رو اجرا نمی کنه و مثلا اگه بهش 5 میلی ثانیه بدم دقیقا هر 5 میلی ثانیه اجرا نمیشه و کمی عقب میمونه که واقعا دردسر ساز شده
می خواستم خواهش کنم که اگر کسی می دونه چطور میشه زمانی که به آن می دهیم را ملفکش کنیم دقیق اجرا کنه و یا یک جایگزین بهتری سراغ داره به ما هم بگوید
ممنون
این همه تکه کدی که به ان زمان می دهم(به عنوان مثال)

dTimer2.Interval = TimeSpan.FromSeconds(0.05);

SMRAH1
شنبه 12 دی 1388, 15:11 عصر
سلام

1) در واقع هر وقت یک تیک تایمر انجام میشه،یک پیغام ایجاد شده که رویداد تیک تایمر رو تحریک می کنه.اینکه این رویداد دقیقا کی پردازش بشه،کاملا بستگی به تعداد پیغامهای درون صف پیغام های برنامه داره (حرکت موس،زدن دکمه از صفحه کلید،بازسازی فرم و... هر کدام یک رویداد هستند که برخی پردازش طولانی و برخی پردازش کوتاه دارند) هر چه تعداد این پیغام ها بیشتر باشد و زمان پردازش آنها بیشتر باشد،رویداد تیک تایمر دیرتر پردازش می شود.
2) زمانهای پایین مثل 5 میلی ثانیه ،معمولا جواب خوبی ندارند.به شکل تجربی من کمتر از 30 میلی ثانیه تنظیم نمی کنم (چون عملا کمتر از این با توجه به نکته بالا،عمل نمی کند).

اما راه حل ها:
1) استفاده از Application.DoEvents که البته راه خوبی نیست و فشار زیادی به CPU و کلا برنامه میاره(اینجا (http://barnamenevis.org/forum/showpost.php?p=865882&postcount=2) رو ببینید).
2) استفاده از یک Thread جدا برای پردازش اطلاعات تایمر و رویداد های آن.

موفق باشید

mehdi.mousavi
شنبه 12 دی 1388, 15:57 عصر
با سلام
مي بخشيد من اين سوال رو در تالار wpf پرسيدم ولي خوب كسي جوابم رو نداد
و از اونجايي كه اين مشكل رو مي شد اينجاهم عنوان كرد ذكر كردم تا انشاالله بشه يك جوابي براش پيدا كرد
شرمنده

این همه تکه کدی که به ان زمان می دهم(به عنوان مثال)

dTimer2.Interval = TimeSpan.FromSeconds(0.05);

سلام.
شما نیاز به High-Resolution Timer ها دارید. توی C#‎ میتونید از QueryPerformanceCounter استفاده کنید. اطلاعات بیشتر رو در MSDN بخونید.

موفق باشید.

پاورقی: توضیحم ناقص بود. منظورم این بود که با متود فوق میتونید متوجه بشید که آیا سیستمی که کد شما روش اجرا میشه، توانایی پشتیبانی از timer با interval های مورد نیاز شما رو داره یا نه. اگر نداره، فکر دیگه ای کنید. در کل، اگر بخوام دقیق خدمتتون عرض کنم، شما نمیتونید توی C# کدهای Mission Critical بنویسید! باید Module ای رو که قراره کار حیاتی شما رو انجام بده، توسط C++ بنویسید و سپس با استفاده از IPC ارتباط بین اون Module و نرم افزار C# خودتون رو فراهم کنید.

m110_110
شنبه 12 دی 1388, 21:43 عصر
سلام
ممنون از جوابتون
یک نکته اینکه سرعتی که من احتیاج دارم 2 و یا حدالامکان 5 بار در ثانیه این رویداد دقیق اجرا بشه
و اینکه ایا می تونم خواهش کنم هم در مورد استفاده Thread به عنوان timer و هم QueryPerformanceCounter کمی توضیح بدهید
البته من از Thread استفاده کرده ام اما نه به عنوان یک timer
باز هم ممنون

mehdi.mousavi
یک شنبه 13 دی 1388, 00:14 صبح
سلام ممنون از جوابتون یک نکته اینکه سرعتی که من احتیاج دارم 2 و یا حدالامکان 5 بار در ثانیه این رویداد دقیق اجرا بشه و اینکه ایا می تونم خواهش کنم هم در مورد استفاده Thread به عنوان timer و هم QueryPerformanceCounter کمی توضیح بدهید البته من از Thread استفاده کرده ام اما نه به عنوان یک timer باز هم ممنون

سلام.
قبل از هر چیز CreateWaitableTimer (http://www.pinvoke.net/default.aspx/kernel32/CreateWaitableTimer.html) رو تست کنید. چون توی این API میتونید Interval رو بر حسب "100 نانو ثانیه" بدید. البته من نمیدونم کاری که میخواهید انجام بدید چی هستش، واسه همین نمیتونم پاسخ دقیقی بهتون بدم... در مورد QueryPerformanceCounter هم لطفا در MSDN مطالعه کنید. (http://msdn.microsoft.com/en-us/library/ms644904%28VS.85%29.aspx)

موفق باشید.

m110_110
یک شنبه 13 دی 1388, 09:49 صبح
سلام
ممنون از جوابتون
با Thread هم تست کردم اون هم دقیق اجرا نمی کنه
اما این آخری رو آزمایش نکردم
انشا الله امشب می بینم چی میشه
به هر حال ممنون

mehdi.mousavi
یک شنبه 13 دی 1388, 11:35 صبح
سلام ممنون از جوابتون با Thread هم تست کردم اون هم دقیق اجرا نمی کنه اما این آخری رو آزمایش نکردم انشا الله امشب می بینم چی میشه به هر حال ممنون

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

موفق باشید.

m110_110
یک شنبه 13 دی 1388, 13:09 عصر
ضمن اینکه هنوز جواب سوال منو ندادید. میشه توضیح بدید این کاری که قرار هست بطور مدام انجام بشه چی هستش؟ شاید راه حل بهتری بشه براش ارائه داد.


سلام
می بخشید
در حال نوشتن یک برنامه هستم که جملاتی را همراه با صوت نمایش می دهد و این طور هست که تقریبا هماهنگ با سرعت صوت، جمله را نمایش می دهد(چون جلمه حرف به حرف میاید) و اینکه برای هر جمله سرعت نمایش جمله(که با استفاده از تایمر هست) را به نسبت طول فایل صوتی می دهم
برای اینکار از تایمر استفاده کردم اما متوجه شدم که در تایمر عددی که به عنوان Interval می گیرد تضمینی ندارد
در یک برنامه جدا تست کردم و معلوم شد که در Interval کوچک تایمر عددی که می گیرد را دقیق اجرا نمی کنه
مثلا اگر به اون 200 میلی ثانیه بدهیم خیلی کم پیش میاد که در هر ثانیه 5 بار رویدادش فراخوانی بشه