نمایش نتایج 1 تا 8 از 8

نام تاپیک: کنترل تایمر

  1. #1
    کاربر دائمی آواتار (سیدشریفی)
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    ایران - تبریز
    پست
    468

    Tick کنترل تایمر

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

  2. #2
    شما باید از توابع 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 هایی باشید و یادتون باشه که حتما اونو از بین ببرید.

  3. #3
    کاربر دائمی آواتار (سیدشریفی)
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    ایران - تبریز
    پست
    468
    آقا سعید سلام
    از جواب شما متشکرم
    کار من راه افتاد و راه حل شما هم خوب جواب داد
    بازهم تشکر :lol:

  4. #4
    کاربر دائمی
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    ایران - تهران
    پست
    2,342
    مطلبی را که سعید خان خیلی خوب توضیح دادند به صورت یک اکتیو ایکس دی ال ال در سایت زیر می توانید پیدا کنید ( قابل توجه راحت طلب ها! )

    www.vbaccelerator.com

  5. #5
    یک راه حل خیلی ساده هم وجود داره

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

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


    ::نوشتن::

  6. #6
    کاربر دائمی آواتار R_BABAZADEH
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    Iran
    پست
    654
    مراقب اجرای کد در چنین Timer هایی باشید
    میشه بیشتر توضیح بدهید

  7. #7
    دوست عزیز

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

    ::نوشتن::

  8. #8

    نقل قول: کنترل تایمر

    سلام به دوستان
    من از تابع killtimer استفاده كردم تا timer برنامه ديگه‌اي رو از كار بندازه اما اينكار انجام نمي‌شه . اگه كسي دليلشو مي دونه لطف كنه بگه.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •