Avatar billede phuc69 Juniormester
16. november 2008 - 20:04 Der er 15 kommentarer og
1 løsning

pause i løkke

jeg vil gerne kunne pause min løkke i 5 sek inden den går videre hvordan gør jeg det
Avatar billede arne_v Ekspert
16. november 2008 - 20:07 #1
Thread.Sleep(5000)
Avatar billede arne_v Ekspert
16. november 2008 - 20:08 #2
Men du må ikke gøre det i en GUI event metode !
Avatar billede phuc69 Juniormester
16. november 2008 - 20:10 #3
Det er i visual basic express. og det vil den ikke den går kold


        For Each foundDirectory As String In My.Computer.FileSystem.GetDirectories("d:\billeder")
            mapper.Items.Add(foundDirectory)
        Next

        For x = 0 To (mapper.Items.Count - 1)
            'MsgBox(mapper.Items(x))

            For Each foundFile As String In My.Computer.FileSystem.GetFiles(mapper.Items(x))
                If foundFile.Substring(foundFile.Length - 3, 3) = "jpg" Then
                    filer.Items.Add(foundFile)
                End If

                If foundFile.Substring(foundFile.Length - 3, 3) = "JPG" Then
                    filer.Items.Add(foundFile)
                End If
            Next

        Next
        For CD = 0 To filer.Items.Count - 1

            PictureBox1.Load(filer.Items(CD))

        Next
Avatar billede arne_v Ekspert
16. november 2008 - 20:18 #4
Nu ved jeg ikke hvad "går kold" betyder i denne sammenhæng.

Hvis du har huske at importere System.Threading så kan du kalde Thread.Sleep.

Men koden ligner grangiveligt noget GUI kode og så virker Thread.Sleep stadig, men
den gør noget andet end du tror - hele GUI vil være frosset mens den kører og så vil
den opdatere i et hug alligevel.
Avatar billede phuc69 Juniormester
18. november 2008 - 21:19 #5
hmm ja det tror jeg også. Som man sikkert kan læse ud af koden så finder koden alle billed filer i en mappe og dennes under mapper. Derefter skulle den gerne smide det ind i pictureboxen. Det virker også fint hvis jeg har msgbox som stopper løkken men hvis jeg kører det uden den. Så sker der ikke noget. Jeg vil derfor gerne ligge et stop på 5-10 sek ind.
Avatar billede arne_v Ekspert
18. november 2008 - 21:37 #6
Så skal du køre det i en separat tråd som ikke blokerer event tråden.
Avatar billede phuc69 Juniormester
18. november 2008 - 21:41 #7
hmm det lyder til at være lidt uden for min viden. Så hvordan gør jeg det
Avatar billede arne_v Ekspert
18. november 2008 - 21:46 #8
Til inspiration:

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 arne_v Ekspert
18. november 2008 - 21:48 #9
(hvis den while løkke skal være helt korrekt skal der nok smides et par
Thread.MemoryBarrier() ind, men du vil have en For Each løkke så ikke relevant
for dig)
Avatar billede phuc69 Juniormester
19. november 2008 - 09:46 #10
Imports System
Imports System.Threading


Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
        Dim t As Thread = New Thread(AddressOf lavstruktur)
        t.Start()

       

    End Sub

    Sub lavstruktur()

        MsgBox("hej")
        For Each foundDirectory As String In My.Computer.FileSystem.GetDirectories("d:\billeder")
            mapper.Items.Add(foundDirectory)
        Next

        For x = 0 To (mapper.Items.Count - 1)
            'MsgBox(mapper.Items(x))

            For Each foundFile As String In My.Computer.FileSystem.GetFiles(mapper.Items(x))
                If foundFile.Substring(foundFile.Length - 3, 3) = "jpg" Then
                    filer.Items.Add(foundFile)
                End If

                If foundFile.Substring(foundFile.Length - 3, 3) = "JPG" Then
                    filer.Items.Add(foundFile)
                End If
            Next

        Next
        For CD = 0 To filer.Items.Count - 1
            Thread.Sleep(500)
            PictureBox1.Load(filer.Items(CD))

        Next
    End Sub
End Class


nu skriver den noget cross threading
Avatar billede arne_v Ekspert
19. november 2008 - 15:25 #11
Du er noedt til at bruge Invoke, naar du opdaterer GUI far den traad du har startet.
Avatar billede cjsoft Nybegynder
19. november 2008 - 16:35 #12
Hej phuc69

Hvis du tilføjer følgende, kan du i din løkke tilføje linien "Pause(5000)".

Private WithEvents myPauseTimer As New Timers.Timer
    Private Sub Pause(ByVal ms As Integer)
        myPauseTimer.Interval = ms
        myPauseTimer.Start()
        Do While myPauseTimer.Enabled = True
            My.Application.DoEvents() 'Sættes ind for at opdatere events
            Threading.Thread.Sleep(1) 'Sættes ind for at CPU-forbrug ikke er 100%
        Loop
    End Sub

    Private Sub myPauseTimerHandler(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs) Handles myPauseTimer.Elapsed
        myPauseTimer.Stop()
    End Sub
Avatar billede phuc69 Juniormester
19. november 2008 - 19:03 #13
cisoft det virkede smid et svar. arne_v tak for indsatsen. Nu skal jeg jo bare til at lære noget mere om de der tråde ;-)
Avatar billede cjsoft Nybegynder
20. november 2008 - 09:54 #14
Svar
Avatar billede arne_v Ekspert
25. november 2008 - 03:10 #15
Inden du begynder at bruge Application.DoEvents() alt for meget, så vil jeg anbefale
dig at google den.
Avatar billede phuc69 Juniormester
29. november 2008 - 15:09 #16
Det fik jeg ikke meget ud af. Det ser dog ud til når jeg bruger den så virker det. nu ser det bare ud til at den ikke lukker ned for processen.

Når jeg kører følgende kode. Så selv om jeg lukker programmet ser det ud til at kører videre. Har ikke prøvet at køre det selvstændigt. Kun inde fra selve Visal Basic Express

Jeg troede det ville stoppe processen. Gør jeg noget forkert

Imports System
Imports System.Threading

Public Class bill


    Private WithEvents myPauseTimer As New Timers.Timer
    Private Sub Pause(ByVal ms As Integer)
        myPauseTimer.Interval = ms
        myPauseTimer.Start()
        Do While myPauseTimer.Enabled = True
            My.Application.DoEvents() 'Sættes ind for at opdatere events
            Threading.Thread.Sleep(1) 'Sættes ind for at CPU-forbrug ikke er 100%
        Loop
    End Sub

    Private Sub myPauseTimerHandler(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs) Handles myPauseTimer.Elapsed
        myPauseTimer.Stop()
    End Sub


    Private Sub bill_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        MsgBox("hej")
        For Each foundDirectory As String In My.Computer.FileSystem.GetDirectories("c:\lasseprogram\billeder")
            mapper.Items.Add(foundDirectory)
        Next

        For x = 0 To (mapper.Items.Count - 1)
            'MsgBox(mapper.Items(x))

            For Each foundFile As String In My.Computer.FileSystem.GetFiles(mapper.Items(x))
                If foundFile.Substring(foundFile.Length - 3, 3) = "jpg" Then
                    filer.Items.Add(foundFile)
                End If

                If foundFile.Substring(foundFile.Length - 3, 3) = "JPG" Then
                    filer.Items.Add(foundFile)
                End If
            Next

        Next
        For CD = 0 To filer.Items.Count - 1
            'Thread.Sleep(500)
            PictureBox1.Load(filer.Items(CD))
            Pause(5000)
        Next

    End Sub

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        myPauseTimer.Stop()
        myPauseTimer.Enabled = False
        Me.Dispose()
    End Sub
End Class
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