Avatar billede schollert Nybegynder
06. februar 2003 - 17:34 Der er 6 kommentarer og
1 løsning

Timer objekt i VB

Kan det være rigtigt, at timer objektet i VB ikke kan tage en værdi > 65000 (ca.)?

Hvad hvis jeg skal have en timer til at køre hvert 2. minut (120000ms)? Skal jeg til at lave en variabel, der tælles op hvert n'te sekund, indtil værdien = 2min.?

/Mich
Avatar billede sion Nybegynder
06. februar 2003 - 18:30 #1
Det var da en mulighed, men jeg tror da godt at VB's timere kan tage intervaller på mere end 65.000 - har du prøvet?
Avatar billede medions Nybegynder
06. februar 2003 - 18:39 #2
Dim dwTime 'skal være en global variabel

Private Sub Form_Load()
    Timer1.Enabled = Not Timer1.Enabled
End Sub

Private Sub Timer1_Timer()
    If Timer1.Enabled Then
        dwTime = dwTime + 1
        lblTid.Caption = CStr(dwTime)
    End If

    If dwTime = 120 Then
      MsgBox("Hey!")
    End If
End Sub


Private Sub cmdChois_Click()

    Timer1.Enabled = Not Timer1.Enabled
   
    If Timer1.Enabled Then
        cmdChois.Caption = "&Stop"
    Else
        cmdChois.Caption = "&Start"
    End If
End Sub

Her skal du så sætte dit interval til at være 1000

//>Rune
Avatar billede jrl0469 Nybegynder
07. februar 2003 - 09:27 #3
I følge ms; fra 1 til 65535
Avatar billede driis Nybegynder
07. februar 2003 - 17:58 #4
Hvis du skal bruge en timer, der kan måle mere end de 2 minutter, kan du evt. bruge Windows API kaldene QueryPerformanceCounter og QueryPerformanceFrequency; med disse kan du måle lige så meget, som du har lyst til, teoretisk set; og endvidere kan du måle meget præcise værdier med disse API kald. API kaldene tager en pointer til et 64 bit integer som argument. Læs mere på:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/queryperformancecounter.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/queryperformancecounter.asp
Avatar billede driis Nybegynder
07. februar 2003 - 18:01 #5
Her er f.eks. et eksempel på hvordan QueryPerformanceCounter kan implementeres i VB. Jeg har også skrevet en timer klasse i C++, der benytter sig af QueryPerformanceCounter, hvis du er interesseret i at se denne.

ublic Type LARGE_INTEGER
    LowPart As Long
    HighPart As Long
End Type
Public Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Public Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Dim T As Long, liFrequency As LARGE_INTEGER, liStart As LARGE_INTEGER, liStop As LARGE_INTEGER, liGet As LARGE_INTEGER
Dim cuFrequency As Currency, cuStart As Currency, cuStop As Currency
Public Function SupportsCounter() As Boolean

If QueryPerformanceFrequency(liFrequency) = 0 Then
    SupportsCounter = False
Else
    SupportsCounter = True
End If
   
End Function

Public Function GetFrequency() As Currency

Call QueryPerformanceFrequency(liFrequency)
GetFrequency = LargeIntToCurrency(liFrequency)

End Function

Public Function GetCount() As Currency
If Not SupportsCounter = False Then
    Call QueryPerformanceCounter(liGet)
    GetCount = LargeIntToCurrency(liGet)
Else
    GetCount = -1
End If
End Function

Public Sub PerfTimerStart()
If Not SupportsCounter = False Then
    Call QueryPerformanceCounter(liStart)
End If
End Sub
Public Function PerfTimerStop() As Currency
If Not SupportsCounter = False Then
    Call QueryPerformanceCounter(liStop)
    cuStop = LargeIntToCurrency(liStop)
    cuFrequency = LargeIntToCurrency(liFrequency)
    cuStart = LargeIntToCurrency(liStart)
   
    PerfTimerStop = (cuStop - cuStart) / cuFrequency
End If

End Function
Public Function PerfTimerStopStr() As String
If Not SupportsCounter = False Then
    Call QueryPerformanceCounter(liStop)
    cuStop = LargeIntToCurrency(liStop)
    cuFrequency = LargeIntToCurrency(liFrequency)
    cuStart = LargeIntToCurrency(liStart)
   
    PerfTimerStopStr = CStr((cuStop - cuStart) / cuFrequency)
End If

End Function
Public Function LargeIntToCurrency(liInput As LARGE_INTEGER) As Currency
    'copy 8 bytes from the large integer to an ampty currency
    CopyMemory LargeIntToCurrency, liInput, LenB(liInput)
    'adjust it
    LargeIntToCurrency = LargeIntToCurrency * 10000
End Function
Avatar billede schollert Nybegynder
10. februar 2003 - 12:12 #6
Tak for tilbagemeldingerne. Jeg implementerede noget a la <Medion>s. Præcissionen er ikke så vigtig i dette tilfælde.

/Mich
Avatar billede medions Nybegynder
10. februar 2003 - 12:14 #7
Thx 4 Poinz

//>Rune
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Capgemini Danmark A/S

Client Partner

Riskpoint A/S (Riskpoint Solutions Limited)

IT Business Analyst