PDA

View Full Version : نحوه کار با timer ها در vb.net



searchman
سه شنبه 16 مرداد 1386, 13:30 عصر
با سلام
دوستان من چه جوری می تونم از تایمر ها در vb استفاده کنم؟
در حقیقت می خوام زمان طی شده در ابتدا و انتهای یک فرایند رو اندازه گیری کنم مثلا بینم یک عملیات ضرب چقدر زمان می گیره؟
از چه تابعی باید استفاده کنم؟
ممنون می شم اگه یک sample برام بگزارید.
با تشکر

saeed_rezaei
سه شنبه 16 مرداد 1386, 13:58 عصر
روش استفاده از تایمر به این صورت هست.
یه تایمر می اندازی روی فرمت
در خاصیت Interval بر حسب میلی ثانیه، زمانی رو مشخص می کنی که می خوای کدهات اجرا بشن. دقت کنید که هر 1000 میلی ثانیه برابر با یک ثانیه هست. پس اگر بخواید هر یک 5 ثانیه کدهاتون اجرا بشن باید عدد 5000 رو وارد کنید.
روی تایمر کلیک کرده و در پنجره کد، در تابع tick کدهایی رو که قصد تکرارشون رو داریم رو مشخص می کنیم.
خاصیت enabled تایمر به صورت پیش فرض false هست. در زمان اجرای برنامه در هر زمان که این مقدار true بشه، برنامه در زمان مشخص شده کدهای شما رو به تکرار اجرا می کنه.
این وضعیت تا زمانی که enabled رو false نکنی ادامه دارد.

اما برای این مشکل شما، می شه یه متغیر سراسر یا استاتیک تعریف کرد. مقدار اولیش صفره هست. تایمر رو تنظیم کنید روی 1000 میلی ثانیه و برای تابع tick کدی بنویسید که در هر بار یه مقدار به متغیرتون اضافه کنه. سپس به محض شروع فرآیند، تایمر رو هم فعال کنید و به محض پایان فرایند، تایمر رو غیر فعال.
در نهایت با بررسی مقدار متغیری که تعریف کرده اید می تونید متوجه شید که چند ثانیه به طول انجامیده است.

bad_boy_2007
سه شنبه 16 مرداد 1386, 14:10 عصر
با کد نویسی هم اینطوریه :


PublicClass Form1
FriendWithEvents t AsNew System.Windows.Forms.Timer
Dim count AsInteger = 0
PrivateSub Form1_FormClosed(ByVal sender AsObject, ByVal e As System.Windows.Forms.FormClosedEventArgs) HandlesMe.FormClosed
MsgBox("total life : " & count & " MS")
EndSub
PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
t.Interval = 1
t.Enabled = True
EndSub
PrivateSub t_Tick(ByVal sender AsObject, ByVal e As System.EventArgs) Handles t.Tick
count += 1
EndSub
EndClass

MH2538
سه شنبه 16 مرداد 1386, 16:55 عصر
سلام
دوست عزیز
1 - عمل ضرب در در حالت عادی در حد چند کلاک بیشتر از سی پی یو وقت نمی گیرد. (یعنی اصلاً به ثانیه نمی رسد)
2- اگر قصد داری مدت زمان انجام یک تابع یا یک رویه رو محاسبه کنی نیازی به تایمر و ایجاد سربار نداری.
شما می تونی قبل از اجرای تابع زمان سیستم رو محاسبه کرده و در زمان پایان تابع نیز همین کار رو بکنید.
تفاضل این دو مقدار مدت زیمان لازم برای اجرای تابع شماست.

bad_boy_2007
سه شنبه 16 مرداد 1386, 21:41 عصر
2- اگر قصد داری مدت زمان انجام یک تابع یا یک رویه رو محاسبه کنی نیازی به تایمر و ایجاد سربار نداری.
شما می تونی قبل از اجرای تابع زمان سیستم رو محاسبه کرده و در زمان پایان تابع نیز همین کار رو بکنید.
تفاضل این دو مقدار مدت زیمان لازم برای اجرای تابع شماست.

درسته راه دوم بسیار بهتره

saeed_rezaei
چهارشنبه 17 مرداد 1386, 09:44 صبح
گرفتن زمان آغاز و پایان از روی ساعت سیستم کار بهتری هست. اما این نکته رو هم باید توجه کنید که ممکنه در طول زمان اجرای یک فرایند به دلایلی (که ذکرشون لازم نیست) ساعت سیستم تغییر کنه.

پویا
چهارشنبه 17 مرداد 1386, 13:36 عصر
ساعت سیستم تغییر نمیکنه ولی ممکنه همون لحظه سیستم عامل درگیر کار دیگه ای باشه و اجرا دستور بیش از اونی که باید طول بکشه و زمان واقعی رو نشه درست بدست آورد

bad_boy_2007
چهارشنبه 17 مرداد 1386, 15:21 عصر
گرفتن زمان آغاز و پایان از روی ساعت سیستم کار بهتری هست. اما این نکته رو هم باید توجه کنید که ممکنه در طول زمان اجرای یک فرایند به دلایلی (که ذکرشون لازم نیست) ساعت سیستم تغییر کنه.

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

omidmehraban
پنج شنبه 18 مرداد 1386, 02:41 صبح
سلام دوستان:
روش های ذکر شده کاملا درسته ولی NET Framework این کارو براتون کرده با کلاس StopWatch
دیگر به کد نویسی نیازی نیست.

Dim a As New Stopwatch()
a.Start()
For i As Int64 = 0 To 300000
''دستورات برنامه
Next
a.Stop()
MsgBox(a.Elapsed.Milliseconds)
می توانید از این مثال استفاده کنید.
------------------------------------------------
زندگی یک بازی است؛مواظب باش قبل از بردن GameOver نشی!
نتیجه اعمال ما در Part II بازی(آخرت) معلوم میشه.

rb2.universal
سه شنبه 16 مهر 1392, 11:20 صبح
سلام میخواستم ببینم میشه به تابع Timer_Tick یک مقدار ارسال کرد؟
اگه میشه لطفا توضیح بدین