PDA

View Full Version : کنترل تایمر



(سیدشریفی)
چهارشنبه 27 فروردین 1382, 11:59 صبح
باسلام
من میخواستم درون تایمر کدی را اجرا کنم و میبایست این کد مثلا در زمانهای مساوی 5 ثانیه اجرا شود
اگر دقت کرده باشید در زمان اجرای کد درون تایمر بستگی به طولانی بودن کد مقداری زمان سپری میشود که پس از اتمام این زمان و اجرای کامل کد درون تایمر - تایمر ازاین لحظه به بعد است که دوباره ست میشود و شروع به شمارش زمان مربوطه میکند
حال اگر این کار مثلا 3 ثانیه طول بکشد و تایمر هم 100 بار اجرا شود به عوض اینکه بر طبق خواسته ما در این 100 بار 500 ثانیه باید گذشته باشد خلاف خواسته ما این زمان به 800 ثانیه خواهد رسید و خطایی در کل بوجود خواهد آمد
حال اگر بخواهیم با ساعت کامپیوتر کار کنیم باز هم به یک تایمر نیاز داریم تا این ساعت را چک کند و این خطای کفته شده دوباره تکرار خواهد شد
لطفا مرا راهنمایی کنید
Seyed_Sharifi@Sorna.net

S.Azish
چهارشنبه 27 فروردین 1382, 14:41 عصر
شما باید از توابع API مثل SetTimer و KillTimer برای حل این مشکل استفاده کنید. اول این توابع رو اضافه کنید



Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

بعد Timer رو ایجاد کنید


Private Sub Form_Load()
SetTimer Me.hwnd, 0, 1000, AddressOf TimerProc
End Sub

یک ماژول به برنامه اضافه کنید و یک روتین به نام TimerProc


Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Sub TimerProc()
Call Sleep(1000)
Form1.Label1.Caption = Time
End Sub

من تابع Sleep رو فقط برای تست برنامه صدا میکنم ولی میبینیم که Timer بدون مشکل هر 1 ثانیه یکبار اجرا میشه.
در نهایت Timer رو باید از بین برد


Private Sub Form_Unload(Cancel As Integer)
KillTimer Me.hwnd, 0
End Sub

مراقب اجرای کد در چنین Timer هایی باشید و یادتون باشه که حتما اونو از بین ببرید.

(سیدشریفی)
چهارشنبه 27 فروردین 1382, 18:41 عصر
آقا سعید سلام
از جواب شما متشکرم
کار من راه افتاد و راه حل شما هم خوب جواب داد
بازهم تشکر :lol:

Vahid_Nasiri
چهارشنبه 27 فروردین 1382, 22:04 عصر
مطلبی را که سعید خان خیلی خوب توضیح دادند به صورت یک اکتیو ایکس دی ال ال در سایت زیر می توانید پیدا کنید ( قابل توجه راحت طلب ها! )

www.vbaccelerator.com

vbhamed
دوشنبه 30 خرداد 1384, 23:12 عصر
یک راه حل خیلی ساده هم وجود داره

کد خودتونو داخل یه تابع دیگه مثل x بنویسید سپس یک متغیر عمومی مثل Flag هم تعریف کنید
هر بار که رویداد تایمر اجرا شده فقط متغیر Flag رو 1 کنید
حال با استفاده از یک تایمر دیگه که زمان اون زیاد مهم نیست اما کم باشد مثلا 20 میلی ثانیه، چک کنید اگر flag برابر 1 باشد آنوقت تابع x را فراخوانی کنید

ضمنا در تابع x متغیر flag را صفر کنید


::نوشتن::

R_BABAZADEH
دوشنبه 30 خرداد 1384, 23:26 عصر
مراقب اجرای کد در چنین Timer هایی باشید
میشه بیشتر توضیح بدهید

vbhamed
سه شنبه 31 خرداد 1384, 20:17 عصر
دوست عزیز

با این کار ما انجام روال وقت گیر رو به یک تایمر دیگه محول می کنیم تا تایمر اصلی کارشو با دقت انجام بده چون کد تایمر اصلی فقط
flag = 1
هست که تقریبا وقتی نمیگیره بنابراین تایمر دقیقا سر پنج ثانیه فراخوانی میشه
از طرفی با هر بار یک شدن متغیر یک بار روال وقت گیر ما توسط تایمر دوم فراخوانی میشه چون تایمر دوم چک می کنه ببینه متقر یک شده یا نه اگر یک شده بود روال رو فراخونی می کنه و در ابتدای روال وقت گیر هم متغیر برابر صفر میشه تا برای اجرای بعدی آماده بشه
ضمنا چون تایمر دوم زمانش کم هست مثلا دویست میلی ثانیه در حقیقت اینجا هم وقتی تلف نخواهد شد

::نوشتن::

Mhosseini
پنج شنبه 06 تیر 1387, 10:06 صبح
:گیج:سلام به دوستان
من از تابع killtimer استفاده كردم تا timer برنامه ديگه‌اي رو از كار بندازه اما اينكار انجام نمي‌شه . اگه كسي دليلشو مي دونه لطف كنه بگه.