PDA

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



aliblue
دوشنبه 31 مرداد 1390, 11:20 صبح
می خوام برنامه ای بنویسم که توش کنترل ها رو حرکت میدم.برای این کار در رویداد Tick تایمر یک واحد به مقدار Button1.Left اضافه می کنم.اما مشکل اینجاست که با این که Interval رو 1 گذاشتم،پس باید در هر ثانیه هزار بار رویداد تیک اجرا بشه و کنترل هزار پیکسل حرکت کنه و در کمتر از 2 ثانیه عرض مانیتور رو طی کنه ولی این زمان خیلی بیشتره.حدود 10 برابر.یعنی انگار هر 1میلی ثانیه اجرا نمیشه.
علتش چیه؟

Padrone
دوشنبه 31 مرداد 1390, 13:13 عصر
interval رو روی 1000 بذار تا در یک ثانیه دستورات رو اجرا کنه

haghshenasmahdi
دوشنبه 31 مرداد 1390, 13:27 عصر
سلام
نم خوام بحستونو خراب کنم فقط یه سوال کوچولو دارم
چرا وقتی من تایمر در برنامه ام ران می کنم ؛ برنامه از حالت پنهان (hide) خارج میشه

mehran_sh_t
دوشنبه 31 مرداد 1390, 13:33 عصر
سلام
موضوع جالب شد!
من دو تا تایمر با دو تا Counter گذاشتم، یکی با Interval 1، یکی با 10، جفتشون با یک سرعت بالا می رفتند!!!
کسی نمی دونه؟

mehran_sh_t
دوشنبه 31 مرداد 1390, 13:36 عصر
interval رو روی 1000 بذار تا در یک ثانیه دستورات رو اجرا کنه
شما متوجه سوال شدی؟

Felony
دوشنبه 31 مرداد 1390, 13:41 عصر
از لحاظ تئوریک اینطور هست و باید تو 1 ثانیه 1000 بار اجرا بشه ولی تو عمل نه چون برنامه یک Message Queue داره که ترد اصلی برنامه ( Main Thread ) به ترتیب به پیغام های داخل اون رسیدگی میکنه ، حالا بسته پیغام های منتظر داخل صف و Priority اون ترد و Time Sliceing پردازنده ، Main Thread ممکنه تو 1 ثانیه کل صف رو پردازش کنه یا تو n ثانیه ؛ حالا بماند که خود پلتفرم Net. هم تو این سرعت پائین نقش داره ( به دلیل وجود زبان میانی و ... ) !

اگر میخواین زمان بندی دقیقی داشته باشید باید از High Resolution Timer (http://msdn.microsoft.com/en-us/library/aa964692(v=vs.80).aspx) ها استفاده کنید .

Padrone
دوشنبه 31 مرداد 1390, 15:38 عصر
شما متوجه سوال شدی؟
اینجور نیست که در هر ثانیه 1000 بار اجرا بشه
اگر بذاری رو 1000 یعنی این که در 1000 میلی ثانیه یک بار اجرا بشه

aliblue
دوشنبه 31 مرداد 1390, 18:40 عصر
interval رو روی 1000 بذار تا در یک ثانیه دستورات رو اجرا کنه

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


اینجور نیست که در هر ثانیه 1000 بار اجرا بشه
اگر بذاری رو 1000 یعنی این که در 1000 میلی ثانیه یک بار اجرا بشه

منم نگفتم میذارم روی هزار.گفتم میذارم روی 1 تا در ثانیه 1000 بار اجرا بشه.
در ضمن وقتی یک بازی اجرا میکنم(need for speed Hot Pursuit) و به ویندوز برمیگردم سرعتش بیشتر شده و انگار همون هزار بار در ثانیه س.


اگر میخواین زمان بندی دقیقی داشته باشید باید از High Resolution Timer (http://msdn.microsoft.com/en-us/library/aa964692%28v=vs.80%29.aspx) ها استفاده کنید .
با تشکر.میشه یه مقدار در موردش توضیح بدین.

Padrone
سه شنبه 01 شهریور 1390, 00:13 صبح
اها، شرمنده متوجه نشدم
مشکل اینجاست که اون میزان دستوراتی که نوشتی نمیتونه در یک میلی ثانیه انجام بشه واسه همین زیاد طول می کشه
اگر می خوای واسه طراحی هایی مثل گیم استفاده کنی بهتره از موتور های گیم مثل agate که با opengl پیاده سازی شده و رایگان هم هست استفاده کنی

aliblue
سه شنبه 01 شهریور 1390, 05:50 صبح
میشه یکم در مورد agate توضیح بدی؟چی هست و با چه زبانی برنامه نویسی میشه و از کجا باید گیر آورد؟
با تشکر.:تشویق:

Farshid007
سه شنبه 01 شهریور 1390, 14:46 عصر
اینجور نیست که در هر ثانیه 1000 بار اجرا بشه
اگر بذاری رو 1000 یعنی این که در 1000 میلی ثانیه یک بار اجرا بشه
اگه در هر ثانیه 1000 بار اجرا بشه
فکر کنم از CPU تون دود که چه عرض کنم اتیش بلند میشه:قهقهه::قهقهه::قهقهه::قه هه::قهقهه::قهقهه::قهقهه:

aliblue
سه شنبه 08 شهریور 1390, 17:05 عصر
اگر میخواین زمان بندی دقیقی داشته باشید باید از High Resolution Timer (http://msdn.microsoft.com/en-us/library/aa964692%28v=vs.80%29.aspx) ها استفاده کنید .
لینکی که گذاشتین رو مطالعه کردم ولی چیزی نفهمیدم.میشه توضیح بدین؟
یعنی یک کنترل آمادست؟از کجا دانلود کنم؟یا تو چه فضای نامی هست؟ممنون میشم راهنمایی بفرمایین.

FastCode
سه شنبه 08 شهریور 1390, 18:04 عصر
خوشم میاد هر کس از راه میرسه پست میده.
همونی که آقای تاجیک نوشتن درسته.
علتش اینه که سیستم عامل ویندوز خودش تقریبا هر ۱۶ میلی ثانیه پیغام ها رو بررسی میکنه.(نمیدونم چرا ۱۶ ولی این رو قبلاً توی یک وبسایت خوندم/فکر میکنم MSDN)
و به همه اکیداً توصیه میشه که هرگز از تایمر استفاده نکنند مگر این که مطمئن باشن استادی که تمرین داده به اندازه کافی خر هست که مجبورشون کنه.
چون هیچگونه تضمینی برای درستی عملکرد.درستی interval (کم و زیاد شدن) و یا جلوگیری از دستکاری از بیرون برنامه وجود نداره.
راه درست همیشه استفاده از signal, wait ,mutex,monitor,semaphore , thread, join, process, shared memory, .... و این موضوعات هست.

aliblue
چهارشنبه 09 شهریور 1390, 13:41 عصر
راه درست همیشه استفاده از signal, wait ,mutex,monitor,semaphore , thread, join, process, shared memory, .... و این موضوعات هست.
اگه با اینا که گفتین آشنایی داشتم که به فکرم می رسید ازشون استفاده کنم!خواهش می کنم درباره شون یکم توضیح بدین.
من برای این که مانند تایمر بتوانم دستورات مشخصی را در هر لحظه اجرا کنم در حلقه ی While(True) از دستور
Thread.Sleep(1);
استفاده کردم ولی بقیه ی قسمت های برنامه از کار میفته و تا زمانی که تو حلقه ست نمیشه مثلا روی دکمه کلیک کرد یا در تکست باکس تایپ کرد.چیکار باید کرد؟
خیلی ممنون.

r0ot$harp
چهارشنبه 09 شهریور 1390, 13:52 عصر
اگه با اینا که گفتین آشنایی داشتم که به فکرم می رسید ازشون استفاده کنم!خواهش می کنم درباره شون یکم توضیح بدین.
من برای این که مانند تایمر بتوانم دستورات مشخصی را در هر لحظه اجرا کنم در حلقه ی While(True) از دستور
Thread.Sleep(1);
استفاده کردم ولی بقیه ی قسمت های برنامه از کار میفته و تا زمانی که تو حلقه ست نمیشه مثلا روی دکمه کلیک کرد یا در تکست باکس تایپ کرد.چیکار باید کرد؟
خیلی ممنون.

دوست عزیز شما با این کارتون میاین و سرباری می شین روی پروسه برنامه و از اونجایی که شما توقف دادین این دستور روی Thread اصلی برنامه اجرا می شه و کلا برنامه قفل می شه . برای رهایی از این مشکل بهتر هست شما با بحث Thread ها آشنا بشین یا روال برنامه رو در یه Thread اجرا کنید یا روال Timer رو در یه Thread Timer اجرا کنید .

باتشکر احسان

r0ot$harp
چهارشنبه 09 شهریور 1390, 13:55 عصر
دوست عزیز به شما و دیگر دوستان پیشنهاد می کنم مقاله زیبای جناب شاه محمدی رو مطالعه کنید . در این مقاله این مشکلات با راه حل شرح داده شده است .
مقاله آموزش Multi Threading (چندنخی) در Visual Basic.Net (http://vbupload.persiangig.com/Archive/Multi%20Threading%20IN%20Visual%20Basic.Net.zip)

باتشکر احسان