vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Frage 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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Frage zum Timer 
Autor: Iced-T
Datum: 03.07.07 13:12

5000 = 5 sekunden
public SHARED timer1 as new timer
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel