PDA

View Full Version : یک دستور برای تاخیر در حد میکرو ثانیه؟



maleknasab
سه شنبه 16 دی 1382, 10:36 صبح
سلام
دوستان آیا دستور یایک تابع api را میشناسید که بتواند تاخیری در حد میکرو ثانیه را در vb انجام دهد؟




با تشکر

Best Programmer
سه شنبه 23 دی 1382, 06:34 صبح
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) d

Public Declare Function SleepEx Lib "kernel32" Alias "SleepEx" (ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long

maleknasab
چهارشنبه 24 دی 1382, 10:54 صبح
حضور آقای a.noor
احترامابه عرض می رسانم که تابع sleep می تواند تا خیری در حد میلی ثانیه ایجاد کند و لی من تاخیری در حد میکرو ثانیه لازم دارم
و جسا رتا جهت یاد آوری عرض میکنم هر یک میکرو ثانیه برابر با یک هزارم میلی ثانیه می باشد . :?: :?:

BehnamPro
جمعه 26 دی 1382, 15:10 عصر
سلام.می تونی یه حلقه الکی تو برنامت بذاری مثلا یه حلقه for که برنامه یه کم سرگرم این حلفه بشه.البته من نمی دونم این تاخیر درحد میکروثانیه میشه یانه؟! :oops:

Best Programmer
سه شنبه 30 دی 1382, 12:10 عصر
RDTSC - Read Time-Stamp Counter
0F 31 RDTSC Read time-stamp counter into EDX:EAX

Description
Loads the current value of the processor's time-stamp counter into the EDX:EAX registers. The time-stamp counter is contained in a 64-bit MSR. The high-order 32 bits of the MSR are loaded into the EDX register, and the low-order 32 bits are loaded into the EAX register. The processor increments the time-stamp counter MSR every clock cycle and resets it to 0 whenever the processor is reset.

The time stamp disable (TSD) flag in register CR4 restricts the use of the RDTSC instruction. When the TSD flag is clear, the RDTSC instruction can be executed at any privilege level; when the flag is set, the instruction can only be executed at privilege level 0. The time-stamp counter can also be read with the RDMSR instruction, when executing at privilege level 0.

The RDTSC instruction is not a serializing instruction. Thus, it does not necessarily wait until all previous instructions have been executed before reading the counter. Similarly, subsequent instructions may begin execution before the read operation is performed.

This instruction was introduced into the Intel Architecture in the Pentium processor.

Operands Bytes Clocks
2 6-7 NP

Flags
None.

البته این دستور اسمبلی هست که در بازی ها به عنوان تابمر پرقدرت استفاده میشود.

maleknasab
چهارشنبه 01 بهمن 1382, 18:34 عصر
با تشکر از شما-بسیار جالب است -ولی آیا در ویژوال بیسیک می توان از دستورات اسمبلی استفاده کرد؟

houshmand
چهارشنبه 01 بهمن 1382, 20:04 عصر
فکر نمی کنم چنین کاری ممکن باشه که بشود به صورت دقیق چند میکرو ثانیه در vb تاخیر انداخت چون اگه دستوری هم باشه که این کار را بکند به علت اینکه سیستم عامل ویندوز چند برنامه را به صورت همزمان اجرا می کند بر نامه های دیگر روی آن تاثیر می گذارند و ممکن است زمانی بیش ار آن که مشخص کردی طول بکشد
:roll:

(سیدشریفی)
پنج شنبه 02 بهمن 1382, 09:25 صبح
همانطور که دوست عزیزمان گفتند من هم فکر نمیکنم چنین چیزی امکان داشته باشد
ما در طی طراحی دستگاهی به تاخیری کمتر از 1 ثانیه احتیاج پیدا کردیم ولی در موقع کار برنامه حتی در تاخیرهای 1 ثانیه ای نیز چون ویندوز به برنامه های دیگری هم نظر میکند این تاخیرهای برنامه ما غیر منظم شد و ما مجبور شدیم برنامه را در محیط داس و از زبان سی پلاس پلاس استفاده کنیم
:lol: :lol: :lol:

S.Azish
پنج شنبه 02 بهمن 1382, 12:59 عصر
شما میتونید از توابع API مثل Sleep یا SleepEx استفاده کنید که حتی قادر به تولید تاخیر در حد یک میکرو ثانیه هم هستند. برای مشکلی که دوستمون گفتن در محیط ویندوز, میتونید به ویندوز بگید که برنامه شما دارای بیشترین اولویت در بین برنامه های دیگه هست تا ویندوز زمان رو تا پایان اجرای برنامه شما کمتر به برنامه های دیگر اختصاص بده.

http://www.mentalis.org/apilist/CreateProcess.shtml




Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function SleepEx Lib "kernel32" (ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long

Best Programmer
پنج شنبه 02 بهمن 1382, 19:16 عصر
همانطور که دوست عزیزمان گفتند من هم فکر نمیکنم چنین چیزی امکان داشته باشد
بله حرف شما درست هست ولی هنگامی که پروس شما در حال کار باشد تا پروسی با اولویت بالاتر نیاید پروس شما اجرا میشود.
این تابع را باید در یک dll در VC یا اسمبلی تحت ویندوز بنویسید. این تابع به طور مستقیم با CPU در ارتباط هست و حتی میتواند بسته به CPU شما
در میکروثانیه هم دقیق باشد. امروزه بازی ها از این تابع به علت سرعت بالا و دقت عالی استفاده میکنند چون در کارایی سیستم تاثیر بسیار بسیار کمی میگذارد.

Best Programmer
جمعه 03 بهمن 1382, 01:35 صبح
Option Explicit
Dim giStartCount As Long
Dim giStopCount As Long
Private Declare Function GetTickCount Lib "Kernel32.dll" () As Long


Private Sub Form_Load()
Dim iCount As Long

SpeedTest True ' Start timing

Do Until iCount = 500000
DoEvents
iCount = iCount + 1
Loop

SpeedTest False ' Stop timing

End Sub

Public Sub SpeedTest(bTimerStart As Boolean)

On Error Resume Next
If bTimerStart Then
giStartCount = GetTickCount()
Exit Sub
Else
giStopCount = GetTickCount()
MsgBox "Code executed in " & vbCrLf & Format$(giStopCount - giStartCount) _
& " milliseconds" & vbCrLf & Format$((giStopCount - giStartCount) / 1000) & " seconds"
End If

maleknasab
جمعه 03 بهمن 1382, 21:19 عصر
مشکل تا خیر در حد میکرو ثانیه را با استفاده از یک dllبا نامport.dll که در کتاب
pc interfaces (اندازه گیری و کنترل با استفاده از پورت های استا ندارد تحت ویندوز) از انتشارات کانون نشر علوم به ضمیمه یک cdحل شد dll بالا را در دایر کتوری سیستم کپی نماییدودر برنامه اتان از توابع مختلف آن استفاده نماییدمن این تاخیرها را روی اسیلسکوپ اندازه گیری نمودم و دقیق می باشد لازم به ذکر است این تست روی ویندوز 98 پارسا انجام گرفته و روی سیستم عاملهای دیگر تست نشده است. dllمربوطه را خواستم ضمیمه کنم اما ظاهرا پسوند dllرا قبول نمی کند!


in module'

(Declare Sub DELAYUS Lib "Port" (ByVal L As Long
in your program'
2میکرو ثانیه تاخیر DELAYUS 2

mehdira
جمعه 20 دی 1387, 15:45 عصر
سلام maleknasab
شما مي توني اين dll رو با winrar فشرده كنيد.من هم به تاخير ميكرو ثانيه شديدا نياز دارم لطفا اين اين كارو بكنيد