| |
VB.NET - Ein- und UmsteigerFrage zum Timer | | | Autor: Nobbi81 | Datum: 03.07.07 12:38 |
| Hallo. Ich programmier unter Visual Studio.Net 2003 und hab ne Frage zum Timer. Der Timer schlägt alle 5 Sekunden zu und soll z.B. eine Zahl in einem Label darstellen. Ist nur zu Testzwecken. Problem ist nur das er nichts darstellt. Erst wenn ich eine Pause von z.B. 50ms einbaue stellt er die Zahl dar. Warum? Zweitens, ich habe während des TimerEvents im Einzelschritt debugged. Un da seh ich den Effekt das er nicht alle 5 Sekunden reinspringt sondern deutlich schneller. Erst als wieder eine Pause reingebaut wurde hatte er die 5 Sekunden Intervall. Nun meine Frage, ist es nicht so, dass wenn ich 5000 Millisekunden einstelle, auch dann erst der Timer nach 5 Sekunden einen Tick auslöst? Irgendwie komisch.
Achso eine Farge fällt mir noch ein. Wie kann man einen Timer im gesamten Projekt (alle Forms) verfügbar machen? Mit nur einfach Public wie früher VB6.0 haut das nicht hin.
Kann mir jemand helfen? | |
Re: Frage zum Timer | | | Autor: Iced-T | Datum: 03.07.07 13:12 |
| 5000 = 5 sekunden
public SHARED timer1 as new timer 0 | |
Re: Frage zum Timer | | | Autor: Nobbi81 | Datum: 03.07.07 13:19 |
| Danke für die Antwort aber das 5000ms gleich 5 Sekunden sind weiß ich auch. Ich wollte ja wissen warum sich das mit der Ausgabe im Timer so verhält. Man benötigt halt ne Pause damit das dargestellt wird, obwohl alle 5 Sekunden der Timer nur zuschlägt. D.H. genug Zeit zum Darstellen. Warum? | |
Re: Frage zum Timer | | | Autor: Melkor | Datum: 03.07.07 13:22 |
| Es gibt drei Timers in .Net. Meinst du WIndows Forms Timer? Mit solchem Code
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
Debug.WriteLine(Now.ToLongTimeString())
Label1.Text = Now.Ticks.ToString()
End Sub und Timer eingestellt auf 5000 Ms und Enabled wird mein Label alle 5 Sekunden aktualisiert und im Trace sehe ich
13:17:27
13:17:32
13:17:37
13:17:42
... Alles scheint also bestens zu laufen. (Ich hatte noch nie Probleme mit dem Timer, ein einfaches Wesen). Was meinst du genau mit "Pause einbauen"?
Those people who think they know everything are a great annoyance to those of us who do - Isaac Asimov | |
Re: Frage zum Timer | | | Autor: Nobbi81 | Datum: 03.07.07 13:39 |
| Ja genau. Den Timer von der Windows Form. ich hatte ja auch noch nie Probleme damit. wenn ich 5 Sekudnen einstell dann sind es auch 5 Sekunden. Aber ich denek auch ds das Einzeldebuggen bei VS.Net 2003 nicht reibungslos läuft. Wie gesagt er ist beim Einzeldebuggen ständig reingegangen und wenn ich eine Labelausgabe hatte und keine PAuse reingebaut hatte wird es nicht dargestellt.
Achso das mit dem Shared hatte ich schon gehört. Meine Frage dazu: Wenn ich das Steuerelement des Timers reinziehe kan nich ja nur Public, Private usw. einstellen. Meintest du das ich Shared in diesem Bereich eintragen soll: "Vom Windows Form Designer generierter Code" Ich habe nämlich nie über SourceCode nen Timer erstellet sondern nur über das STeuerelement. | |
Re: Frage zum Timer | | | Autor: Melkor | Datum: 03.07.07 13:56 |
| Shared brauchst du nicht, würde ich auch nicht empfehlen für solche Steuerelemente. Du kannst einen Handler hinzufügen für andere Forms, solange die Form mit dem Timer aktiv ist.
Those people who think they know everything are a great annoyance to those of us who do - Isaac Asimov | |
Re: Frage zum Timer | | | Autor: Nobbi81 | Datum: 03.07.07 15:44 |
| Sorry hab nen Problem in der Timerroutine. Ich würde gern im Timer eine Methode starten, die eine DataSet löscht und wieder füllt. Die Methode ist folgende:
Public Function DataSet_aktualisieren(ByVal sSQL As String, ByVal DS_Name As _
String)
Dim CB As OleDbCommandBuilder
Dim DA As OleDbDataAdapter
Dim DR As DataRow
Try
'Lösche den Inhalt des DataSets um es neu zu füllen
'Durch das Füllen werden wieder alle Daten (aktuell oder neu)
' erfasst!
DS_all.Tables(DS_Name).clear()
delay(100)
DA = New OleDbDataAdapter(sSQL, db.adoConn)
CB = New OleDbCommandBuilder(DA)
DA.Fill(DS_all, DS_Name)
Catch ex As Exception
If Me.tmrSchichtplan.Enabled = True Then
tmrSchichtplan.Enabled = False
End If
MsgBox("DataSet konnte nicht aktualisiert werden!" & _
Environment.NewLine & _
ex.Message, MsgBoxStyle.Critical)
End Try
End Function Im Timer wird die MEthode folgendermaßen gestartet:
Dim SQL As String = "Select * FROM tblAnrufer"
Me.DataSet_aktualisieren(SQL, "Anrufer") Er springt zwar in die Methode, aber beim Löschen des DataSets meckert er rum und meint: "Objektvariable oder With-Blockvariable wurde nicht festgelegt" Wenn ich aber die Methode über einen Button in der MainForm starte dann läuft alles Bestens. Muss ich irgendwas im Timer aktivieren? Wie gesagt der Timer ist in der mainForm als Steuerelemnt vorhanden.
Wäre für jede Antwort dankbar!! | |
Re: Frage zum Timer | | | Autor: Melkor | Datum: 03.07.07 15:51 |
| Wahrscheinlich das erste Mal hast du noch keine Tabelle.
Those people who think they know everything are a great annoyance to those of us who do - Isaac Asimov | |
Re: Frage zum Timer | | | Autor: Nobbi81 | Datum: 03.07.07 16:03 |
| Naja im Timer wird ja einmal die Tabelle erstellt und dann sollte er das ja wissen. Genauso läuft mit den anderen Tabellen auch nur das die in der Form_Load einmal erstellt werden. Also da ist die Tabelle. Komisch ist nur das wenn ich über den Button die Methode starte alles geht und wenn sie im Timer aufgerufen wird nicht geht!
Public Sub tmrSchichtplan_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles tmrSchichtplan.Tick, cmdSortAnrufer.Click
Dim Tag As String
Dim Fruehschicht As String
Dim Spaetschicht As String
Dim Fruehschicht_Name, Spaetschicht_Name As String
Dim DA_Schicht As OleDbDataAdapter
Dim cm_Schicht As CurrencyManager
Dim drv_Schicht As DataRowView
Dim DT_Stat As DataTable
Dim CB As OleDbCommandBuilder
If Schicht_changed = True Then
Try
'Wochentag holen
Tag = Format(Date.Now.DayOfWeek.ToString)
Dim sSQL = "SELECT Fruehschicht_Name, Spaetschicht_Name," & _
"Spaetschicht_Start, Fruehschicht_Start FROM tblSchichten" & _
"WHERE Wochentag = '" & Tag & "'"
AddToDS("Schicht", db.adoConn, sSQL)
cm_Schicht = CType(Me.BindingContext(DS_all, "Schicht"), _
CurrencyManager)
drv_Schicht = CType(cm_Schicht.Current, DataRowView)
'Hole die Tagesdaten
Fruehschicht = drv_Schicht(3)
Spaetschicht = drv_Schicht(2)
Fruehschicht_Name = drv_Schicht(0)
Spaetschicht_Name = drv_Schicht(1)
'Jetzt nur den einen aktivieren!
If (DateTime.Now.ToShortTimeString >= Fruehschicht) And ( _
DateTime.Now.ToShortTimeString < Spaetschicht) Then
'Alle auf active=0 setzen!
Dim SQL As New OleDbCommand("UPDATE tblAnrufer SET" & _
"active=0", db.adoConn)
SQL.CommandTimeout = 2 'maximal 2 Sekunde warten
SQL.ExecuteNonQuery() 'SQL-Befehl ausführen
delay(150)
'Aktiv ist die Fruehschicht!
Dim SQL_2 As New OleDbCommand("UPDATE tblAnrufer SET" & _
"active=1 WHERE name = '" + Fruehschicht_Name + "'", _
db.adoConn)
SQL_2.CommandTimeout = 2 'maximal 2 Sekunde warten
SQL_2.ExecuteNonQuery() 'SQL-Befehl ausführen
End If
If (DateTime.Now.ToShortTimeString >= Spaetschicht) Then
'Alle auf active=0 setzen!
Dim SQL_3 As New OleDbCommand("UPDATE tblAnrufer SET" & _
"active=0", db.adoConn)
SQL_3.CommandTimeout = 2 'maximal 2 Sekunde warten
SQL_3.ExecuteNonQuery() 'SQL-Befehl ausführen
delay(150)
'Aktiv ist die Spaetschicht
Dim SQL_4 As New OleDbCommand("UPDATE tblAnrufer SET" & _
"active=1 WHERE name = '" + Spaetschicht_Name + "'", _
db.adoConn)
SQL_4.CommandTimeout = 2 'maximal 2 Sekunde warten
SQL_4.ExecuteNonQuery() 'SQL-Befehl ausführen
End If
Me.DataSet_aktualisieren("Select * FROM tblAnrufer", "Anrufer")
Schicht_changed = False
' Me.tmrSchichtplan.Enabled = False
Catch ex As Exception
'Stoppe den Schicht-Timer
Me.tmrSchichtplan.Enabled = False
MsgBox("Der Schichtplan konnte nicht bearbeitet werden!" & _
Environment.NewLine & _
ex.Message, MsgBoxStyle.Critical)
End Try
End If
End Sub | |
Re: Frage zum Timer | | | Autor: Melkor | Datum: 03.07.07 16:10 |
| An sich sieht's so aus
DS_all.Tables(DS_Name).clear() ' Erstes Mal existiert die Tabelle
' nicht
delay(100)
DA = New OleDbDataAdapter(sSQL, db.adoConn)
CB = New OleDbCommandBuilder(DA)
DA.Fill(DS_all, DS_Name) ' Tabelle wird hier angelegt Those people who think they know everything are a great annoyance to those of us who do - Isaac Asimov | |
Re: Frage zum Timer | | | Autor: Nobbi81 | Datum: 03.07.07 16:28 |
| Ich mach das über diese Methode:
' ### Hinzufügen einer Tabelle zu einem DataSet (unter Angabe eines
' Connection-Objekts)
Public Overloads Sub AddToDS(ByVal Name As String, ByVal Conn As _
OleDbConnection, ByVal SQL As String)
DA_all = New OleDbDataAdapter(SQL, Conn)
DA_all.Fill(DS_all, Name)
End Sub Sie wird in der FormLoad einmal aufgerufen und es werden mit einem DataSet mehrere Tabellen zugeordnet. Natürlich kann ich nicht vor der einmaligen Erstellung das Löschen des DataSets machen, da sonst die Meldung "Objektvariable oder With-Blockvariable wurde nicht festgelegt" kommt. Also versteh ich so, dass ich einmal alle erstelle und das DataSet nun alle Tabellen besitzt. Wie gesagt es haut alles hin aber sobald ich datenbank spezifische Methoden im Timer aufrufe klappt nichts. Außerhalb des Timers haut alles hin. Naja was heißt haut nichts hin im Timer. Im Timer kann ich den eben gesendeten Code abarbeiten. Problem ist nur, dass ich eine Aktualisierung der Tabelle "Anrufer" machen muss, da ich mit SQL.ExecuteNonQuery() direkt was in die Datenbank schreibe und das DataGrid nun die neuen Dinge ausgeben soll. Und die Aktualisierung haut halt nicht hin. Wie onben angegeben! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|