Avatar billede l_domino_l Nybegynder
02. februar 2007 - 09:29 Der er 9 kommentarer og
1 løsning

ProgressBar skal kører

Jeg sætter en stor handling igang i VB.

Så vil jeg gerne have en Progressbar til at køre imens, så brugeren ikke tror at programmet er gået ned.

Den skal bare kører stille og roligt, og starte forfra når den kommer til den anden ende.

Hvordan gør jeg det?
Avatar billede mcgoat Nybegynder
02. februar 2007 - 09:31 #1
Du kan vel bare sætte en Progressbar ind, og lave en timer der sætter dens value += 1, og hvis den når MAX så sæt value til 0 og fortsæt
Avatar billede l_domino_l Nybegynder
02. februar 2007 - 09:53 #2
Nope, for når den anden funktion går igang, sker der ikke mere med min Progressbar
Avatar billede mcgoat Nybegynder
02. februar 2007 - 10:55 #3
Burde den da ikke gøre hvis du har en timer der kører sideløbende med programmet.

Med mindre du laver noget i f.eks en WHILE løkke. Så skal du have noget ala. Application.DoEvents() ind i løkken. Så opdaterer den programmet imens.
Avatar billede mrbonus Novice
02. februar 2007 - 11:15 #4
dette kan være en mulig løsning

    Private Sub buttonProgressBarStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonProgressBarStart.Click
        Dim thread As New Threading.Thread(AddressOf doFunction)
        thread.Start()
        thread.Sleep(1000)
       
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = 10
        ProgressBar1.Step = 1

        Dim i As Integer = 0
        While threadRunning
            i = (i + 1)
            ProgressBar1.Increment(1)
            If i Mod 10 = 0 Then
                ProgressBar1.Value = 0
            End If
            Threading.Thread.Sleep(200)
        End While
    End Sub

    Private Shared threadRunning As Boolean = False
    Public Shared Sub doFunction()
        threadRunning = True
        Threading.Thread.Sleep(5000) 'denne linie skal erstattes med dit 'lange' funktionskald
        threadRunning = False
    End Sub
Avatar billede l_domino_l Nybegynder
02. februar 2007 - 11:38 #5
Threading.Thread.Sleep(5000) 'denne linie skal erstattes med dit 'lange' funktionskald
Mener du jeg bare skal skrive
HentProgramFraNettet?
Avatar billede mrbonus Novice
02. februar 2007 - 12:21 #6
enten indsætter du alt din kode der, eller også laver du en "private shared function" som du kalder derfra
Avatar billede mrbonus Novice
02. februar 2007 - 13:14 #7
har du fået det til at virke?
Avatar billede arne_v Ekspert
03. februar 2007 - 03:26 #8
jeg synes det lyder som om at en ProgressBar i formen skal opdateres via Invoke fra
tråden

et eksempel med fil download:

Imports System
Imports System.Drawing
Imports System.IO
Imports System.Net
Imports System.Windows.Forms
Imports System.Threading

Public Class MainForm
Inherits Form
    Private bar As ProgressBar
    Private start As Button
    Private abort As Button
    Private t As Thread

    Public Sub New()
        bar = New ProgressBar
        start = New Button
        abort = New Button
        SuspendLayout
        bar.Location = New Point(50, 50)
        bar.Size = New Size(200, 50)
        bar.Name = "Progress Bar"
        start.Location = New Point(50, 150)
        start.Size = New Size(200, 50)
        start.Name = "Start Button"
        start.Text = "Start"
        AddHandler start.Click, AddressOf StartClick
        abort.Location = New Point(50, 250)
        abort.Size = New Size(200, 50)
        abort.Name = "Abort Button"
        abort.Text = "Abort"
        AddHandler abort.Click, AddressOf AbortClick
        ClientSize = New Size(300, 350)
        Controls.Add(bar)
        Controls.Add(start)
        Controls.Add(abort)
        Name = "Main Form"
        Text = "Main Form"
        ResumeLayout(False)
    End Sub
    Sub ResetBar(ByVal n As Integer)
        bar.Minimum = 0
        bar.Maximum = n
        bar.Value = 0
    End Sub
    Sub UpdateBar(ByVal n As Integer)
        bar.Value = n
    End Sub
    Delegate Sub ResetHandler(ByVal n As Integer)
    Delegate Sub UpdateHandler(ByVal n As Integer)
    Sub Copy()
        Try
        Dim req As HttpWebRequest = CType(WebRequest.Create("http://wasd.vsm.com.au/wasd/htroot913.zip"), HttpWebRequest)
        Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
        Dim tot As Integer = CType(resp.ContentLength, Integer)
        If bar.InvokeRequired Then
            bar.Invoke(New ResetHandler(AddressOf ResetBar), New Object() {tot})
        Else
            ResetBar(tot)
        End If
        Dim f1 As Stream = resp.GetResponseStream
        Dim f2 As Stream = New FileStream("C:\htroot913.zip", FileMode.CreateNew, FileAccess.Write)
        Dim sofar As Integer = 0
        Dim b(1000) As Byte
        Dim n As Integer
        n = f1.Read(b, 0, b.Length)
        While n > 0
            f2.Write(b, 0, n)
            sofar += n
            If bar.InvokeRequired Then
                bar.Invoke(new UpdateHandler(AddressOf UpdateBar), New Object() {sofar})
            Else
                UpdateBar(sofar)
            End If
            n = f1.Read(b, 0, b.Length)
        End While
        f2.Close
        f1.Close
        resp.Close
        Catch ex As Exception
        MessageBox.Show(ex.Message)
        End Try
    End Sub
    Sub StartClick(ByVal sender As Object, ByVal e As EventArgs)
        t = New Thread(AddressOf Copy)
        t.Start
    End Sub
    Sub AbortClick(ByVal sender As Object, ByVal e As EventArgs)
        t.Abort
    End Sub
    <STAThread()> _
    Public Shared Sub Main(ByVal args As String())
        Application.Run(New MainForm)
        Application.Exit
        Environment.Exit(0)
    End Sub
End Class
Avatar billede l_domino_l Nybegynder
19. februar 2007 - 15:44 #9
ligger du ikke lige et svar?
Avatar billede arne_v Ekspert
19. februar 2007 - 17:21 #10
moi ?
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
Kategori
Kurser inden for grundlæggende programmering

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