Avatar billede joemoz Nybegynder
05. januar 2010 - 18:39 Der er 7 kommentarer og
1 løsning

Løbende opdatering af værdier

Jeg har et vb.net program der når det åbner henter værdier fra en række forskellige FTP-servere og indsætter dem i tekstbokse i en form.

Jeg kunne godt tænke mig løbende at opdatere værdierne, altså sådan set køre 'form load' igen automatisk ca. hvert 5. minut, men omvendt ønsker jeg ikke at programmet skal stå og køre i 'vente'-mode, da det tilsyneladende får maskinen til at gå lidt i baglås, og jeg i øvrigt gerne vil give brugerne adgang til at rette i nogle felter.

Hvordan kan jeg gøre det (uden manuelt selv at aktivere den vha. en knap)?
Avatar billede arne_v Ekspert
06. januar 2010 - 02:52 #1
Du starter en tråd (evt. i form af time) som kører hver X. minut, henter data og opdaterer GUI via Invoke.
Avatar billede arne_v Ekspert
06. januar 2010 - 02:54 #2
Her er et super simpelt eksempel som tæller et tal op hvert sekund (1000 millisekunder):

Imports System
Imports System.Threading

Public Class Form1
    Private done As Boolean
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        done = False
        Dim t As Thread = New Thread(AddressOf TextUpdateThread)
        t.Start()
    End Sub
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        done = True
    End Sub
    Private Sub TextUpdateThread()
        Dim i As Integer = 0
        While Not done
            i = i + 1
            If TextBox1.InvokeRequired Then
                TextBox1.Invoke(New TextUpdateHandler(AddressOf TextUpdate), New Object() {i})
            Else
                TextUpdate(i)
            End If
            Thread.Sleep(1000)
        End While
    End Sub
    Private Delegate Sub TextUpdateHandler(ByVal n As Integer)
    Private Sub TextUpdate(ByVal n As Integer)
        TextBox1.Text = n.ToString()
    End Sub
End Class
Avatar billede joemoz Nybegynder
10. januar 2010 - 16:40 #3
Tak for det - det ser fornuftigt ud, men jeg er lidt i tvivl om hvordan jeg skal lave det. Jeg ønsker principielt bare at den skal kalde en sub hver gang den har ventet et stykke tid.

Jeg kan ikke helt gennemskue måden du bruger invoke-funktionen, kan du eksemplificere hvordan man kunne gøre det, så den kalder en sub i stedet for at lægge et nummer til en textbox-værdi?
Avatar billede arne_v Ekspert
19. januar 2010 - 04:01 #4
TextUpdateThread henter oplysninger via FTP og kalder TextBoxn.Invoke til at opdatere GUI med.
Avatar billede arne_v Ekspert
30. januar 2010 - 23:44 #5
ok?
Avatar billede joemoz Nybegynder
01. februar 2010 - 21:37 #6
Ja, men kan jeg ikke opdatere GUI vha. my.application.doevents i stedet for?
Avatar billede arne_v Ekspert
01. februar 2010 - 21:46 #7
Man kan ogsaa proeve at lave det som tager lang tid i event traaden (button click) og saa kalde Application.DoEvents hyppigt.
Men det er ikke nogen god ide. Der kan ske forskellige ting og sager.

Proev og google paa:
  applications doevents evil
Avatar billede joemoz Nybegynder
01. februar 2010 - 21:54 #8
Tak.
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

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