Reálný časovač (sekunda není sekunda)   zodpovězená otázka

VB6/VBA

Ahoj všichni narazil jsem na problém a jsem si jist, že jste ho už někdo řešil googlil jsem ,bez velkeho úspechu.

Dělám jakési stopky/časomíru a narazil jsem na problém, že po uběhnutí cca 10 sekund se ralita liší od programu už jednou sekundou.

Prikládám zjednodušený kod:

Timer1 je na interval 10

tři tlačítka a jeden text

Private casovac As Integer

Private minuta As Integer
Private sekunda As Integer
Private setina As Integer

Private Sub cmdReset_Click()
casovac = 0
minuta = 0
sekunda = 0
setina = 0

Timer1.Enabled = False
Text1.Text = 0

End Sub

Private Sub cmdStart_Click()
casovac = 0
Timer1.Enabled = True
End Sub

 

Private Sub cmdStop_Click()
Timer1.Enabled = False
End Sub


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

Private Sub Timer1_Timer()
casovac = 1

setina = setina + casovac

If setina > 99 Then
    setina = 0
    sekunda = sekunda + 1
End If

If sekunda > 59 Then
    sekunda = 0
    minuta = minuta + 1
End If

If minuta > 9 Then
    minuta = 0
End If


Text1.Text = minuta & ":" & sekunda & ":" & setina

End Sub


nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Nikdo vam nezarucuje, ze se Timer opravdu stihne pokazde vcas spustit. A proto postupne zvetsujete zpozdeni. Takto se pouzivat neda. Radeji si ulozte cas spusteni a pak jej odecitejte od aktualniho casu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za info, taky mě to napadlo ,ale já potřebuju vidět i průběh času to bych taky zvládl ,ale čas potřebuju na setinu sekundy.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Předpokládám, že nebudete dosahovat rychlosti světla a proto bude pro vás čas plynout stejně jako pro ostatní. Stačí tedy v timeru zobrazovat časový rozdíl. Rozhodně jej nepočítejte manuálně.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK díky za rady. Zkoušel jsem to přes API ,ale i tam byl rozdíl u 12min skoro 10 sekund od pravdy.

Nechápu kde tedy nějaký měřící sw bere přesné hodiny.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Zkuste si příklad:

Na Form1 vložte Button1, Label1, TextBox1, Label2, TextBox2, do aplikace přidejte Timer1 - ostatní obstará následující kód

Public Class Form1
  Dim Start As Double

  ''' <summary>
  ''' Příklad měření času
  ''' </summary>
  ''' <remarks>
  ''' Na Form1 vložte Button1, Label1, TextBox1, Label2, TextBox2
  ''' do aplikace přidejte Timer1
  ''' ostatní obstará násl. kód
  ''' </remarks>
  Private Sub Form1_Load(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles MyBase.Load
    Dim Pismo As Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0)
    Me.Text = " Měření času"
    Me.ClientSize = New System.Drawing.Size(302, 86)
    '------------
    Me.Button1.AutoSize = True
    Me.Button1.Font = Pismo
    Me.Button1.Location = New System.Drawing.Point(198, 12)
    Me.Button1.Size = New System.Drawing.Size(96, 30)
    Me.Button1.Text = "Reset"
    '-------------
    Me.Label1.AutoSize = True
    Me.Label1.Font = Pismo
    Me.Label1.Location = New System.Drawing.Point(7, 17)
    Me.Label1.Name = "Label1"
    Me.Label1.Size = New System.Drawing.Size(56, 20)
    Me.Label1.Text = "Start:  "
    '-------------
    Me.TextBox1.Font = Pismo
    Me.TextBox1.Location = New System.Drawing.Point(63, 14)
    Me.TextBox1.Name = "TextBox1"
    Me.TextBox1.Size = New System.Drawing.Size(128, 26)
    Me.TextBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
    '---------------
    Me.Label2.AutoSize = True
    Me.Label2.Font = Pismo
    Me.Label2.Location = New System.Drawing.Point(7, 53)
    Me.Label2.Name = "Label2"
    Me.Label2.Size = New System.Drawing.Size(135, 20)
    Me.Label2.Text = "Od startu uběhlo: "
    '-------------
    Me.TextBox2.Font = Pismo
    Me.TextBox2.Location = New System.Drawing.Point(149, 50)
    Me.TextBox2.Name = "TextBox2"
    Me.TextBox2.Size = New System.Drawing.Size(145, 26)
    '-------------
    Start = Environment.TickCount()
    Me.TextBox1.Text = Now.ToString("HH:mm:ss.fff")
    Me.Timer1.Start()
    ' pro ladění - mmusí vrátit 1:05:02.125
    ' TextBox1.Text = cas(3902125) 
  End Sub

  Private Function cas(ByVal i As Integer) As String
    Dim cs As String ' budoucí obsah pro TextBox
    Dim ss As String = i Mod 1000 ' milisekundy
    i = i \ 1000
    Dim h As String = CStr(i \ 3600) ' hodiny
    Dim m As String = CStr((i Mod 3600) \ 60) ' minuty
    Dim s As String = CStr(i Mod 60) ' sekundy
    If Len(m) = 1 Then m = "0" & m
    If Len(s) = 1 Then s = "0" & s
    cs = h & ":" & m & ":" & s & "." & ss
    Return cs
  End Function

  Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click
    Start = Environment.TickCount()
    TextBox1.Text = Now.ToString("HH:mm:ss.fff")
  End Sub

  Private Sub Timer1_Tick(ByVal sender As System.Object, _
     ByVal e As System.EventArgs) Handles Timer1.Tick
    Me.Text = " Systémový čas: " & Now.ToString("HH:mm:ss.fff")
    TextBox2.Text = " " & cas(Environment.TickCount() - Start)
  End Sub

End Class

Vezměte si z příkladu co potřebujete, pokud se hodí. Po 40 minutách jsem zaznamenal rozdíl 1 milisekundy - můžete měřit rychlost neutrin :-))

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Sice jsem to potřeboval ve VB6 ,ale pokusím se celou aplikaci upravit na vyšší. Díky za tip.

nahlásit spamnahlásit spam -1 / 3 odpovědětodpovědět

Tak to jsem přehlédl, pardon. Ale na stejném principu to jde udělat i ve VB6.

K zachycení okamžiku startu se místo "Environment.TickCount()" použije Timer. Pro použití formátovací funkce z příkladu pro .NET je nutné hodnotu uběhlého času vynásobit 1000, protože Timer vrací sekundy a s desetinnými místy. Je proto třeba parametr definovat jako Double místo Integer a upravit syntaxi pro VB6 (rozdělit definici a naplnění hodnotou do samostatných řádků). Také formátovací řetšzec je trochu jiný.

Funguje to stejně jako v příkladu pro .NET

  Option Explicit
  Dim Start As Double

  Private Sub Form_Load()
    Start = Timer
    Text1 = " " & cas(Timer)
    '  pro ladění - mmusí vrátit 1:05:02.125
    ' Text1 = cas(3902.125)
    Timer1.Enabled = True
  End Sub

  Private Sub Command1_Click()
    Start = Timer
    Text1 = " " & cas(Timer)
  End Sub

   Private Function cas(ByVal i As Double) As String
      i = i * 1000
      Dim ss As String  ' milisekundy
      ss = i Mod 1000
      i = i \ 1000
      Dim h As String ' hodiny
      h = CStr(i \ 3600)
      Dim m As String ' minuty
      m = CStr((i Mod 3600) \ 60)
      Dim s As String ' sekundy
      s = CStr(i Mod 60)
      If Len(m) = 1 Then m = "0" & m
      If Len(s) = 1 Then s = "0" & s
      cas = h & ":" & m & ":" & s & "." & ss
  End Function

  Private Sub Timer1_Timer()
     Me.Caption = " Systémový čas: " & Format(Now, "Hh:Nn:Ss")
    Text2 = " " & cas(Timer - Start)
  End Sub
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Mnohokrát děkuji vytáhl jste mi obrovský trn z paty.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback