Jag har en Timer och Label. Jag skulle vilja visa "aktuell tid" hos Timern i Labeln. Exakt vad är du vill? Undvik att uppdatera controller från andra trådar än huvudtråden. OK, hur borde en enkel timer-event se ut om man t.ex. vill uppdatera en label med aktuell tid en gång i sekunden (i VB.NET)? Jag kanske skulle varit lite tydligare... Anders, Patrik, Timern körs i en seperat tråd från ditt GUI - då måste du använda synkroniserad invoke för att det ska fungera korrekt. Om jag inte minns fel så körs System.Timers.Timer i egen tråd <b>och</b> kör eventet i egen tråd medan system.Windows.Forms.Timer också kör i egen tråd <b>men</b> kör sedan invoke till huvudtråden där eventet sedan körs? Om det nu är så som du säger, varför returnerar då label1.invokerequired false? Tar man sig en närmare till på <b>System.Windows.Forms.Timer</b> så hittar man följande saker. Det första man hittar är deklarationen på själva handlern.Timer
Hur gör man det?
mvh OlaSv: Timer
Anta att du har en timer på 5 sek, skulle du i en label vilja visa hur långt det är kvar för den timern innan den noll, eller?
Vad jag vet så finns det tyvärr ingen property på en timer som visar dess "nedräkningsstatus".
Däremot skulle du kunna använda dig av en timespan som du sätter till "nedräkningstiden" och använder en timer för att räkna ned den. Typ så här:
<code>
Dim ts As New TimeSpan(0, 0, 30) ' Sätt nedräkningstiden till 30 sekunder
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = ts.ToString
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
ts = ts.Subtract(New TimeSpan(0, 0, 0, 0, Timer1.Interval)) ' Räkna ned tiden lika mycket som timerns intervall
Label1.Text = ts.ToString
If ts.TotalMilliseconds = 0 Then ' Gör nåt när vi kommer till 0
Timer1.Enabled = False
MessageBox.Show("Tiden är ute")
End If
End Sub
</code>
/MarcusSv:Timer
Läs: http://www.cshrp.net/content.aspx?showID=958Sv: Timer
/MarcusSv:Timer
Marcus,
Läs tråden som Patrik hänvisade dig till. När du har förstått innebörden av den, samt lösningen på det problem som prestenteras så skall du göra följande. Du lägger till en <b>Timer</b> och sätter dess intervall till 1000ms (= 1s). Du lyssnar på <b>Tick</b> händelsen (utgår ifrån att du använder Timer klassen som finns i <b>System.Windows.Forms</b> namnrymnden). När denna triggas så sätter du (med hjälp av det Patrik hänvisade till) <b>Text</b> propertyn på din <b>Label</b> till <b>DateTime.Now.ToShortTimeString()</b>.
Hoppas det löser sig!Sv: Timer
Om jag har en Timer med "Timer1.Interval = 15000" så vill jag ha en Label som hela tiden visar hur långt "räkningen" från noll mot 15000 har kommit.
Tänkte kanske att det fanns en bar lösning. En halvbra skulle vara att ha ytterligare en Timer med "Timer2.Interval = 1000" och en variabel som räknas upp med 1000 varje gång Timer2 körs....
Mvh OlaSv: Timer
I mitt kodexempel använde jag den timer som finns i System.Windows.Forms, om man läser i hjälpen för den timern så står det att den är optimerad för använding i Windows Forms applikationer.
Läs följande urklipp:
"Remarks
A Timer is used to raise an event at user-defined intervals. This Windows timer is designed for a single-threaded environment where UI threads are used to perform processing."
Hur tolkar man det? Kommer denna timers tick-event att köra på huvudtråden?
Jag testade att i tick-eventet kolla följande:
<code>
debug.writeline(Label1.InvokeRequired)
</code>
Den svarar med <b>false</b>, dvs att man inte behöver använda kontrollens invoke-metod.
Jag är inte ute efter tuppfäktning nu, utan bara att få 100% klarhet i ärendet.
/MarcusSv:Timer
Sv: Timer
Sv: Timer
/MarcusSv:Timer
Private onTimer As EventHandler
Sen hittar vi deklarationen på händelsen
Public Event Tick As EventHandler
Tar vi oss sedan en titt på hur händelsen triggas ser vi följande
Protected Overridable Sub OnTick(ByVal e As EventArgs)
If (Not Me.onTimer Is Nothing) Then
Me.onTimer.Invoke(Me, e)
End If
End Sub