Visual Basic .net : form niet zichtbaar tijdens uitvoeren

Plaats reactie
Kenneth
Premium Member
Premium Member
Berichten: 511
Lid geworden op: 27 feb 2007, 11:31
Locatie: wervik
Uitgedeelde bedankjes: 1 keer
Bedankt: 6 keer

Kreeg hier net de vraag van iemand en moet zeggen dat ik het antwoord er niet op weet en ook niet vind via google.

Kopie-Plak uit mailke


Ik probeer een csv bestand in te lezen van een goede 20.000 records. In form1 is er een knop waarmee het bestand geselecteerd wordt en een twee knop waarmee de actie wordt gestart.

De actie bestaat erin dat een tweede form wordt geopend met een progressbar.


Code: Selecteer alles

Private sub Form_Load
do while bestand_niet_ten_einde
lijn_naar_tabel
Progressbar.PerformStep
loop
End Sub


Probleem is dat het tweede form (en dus ook de progressbar) pas te zien is nadat alles al ingelezen is.

einde kopie-plak

Moet zeggen dat ik niet direct een antwoord kan verzinnen
khsw
Elite Poster
Elite Poster
Berichten: 1158
Lid geworden op: 03 maa 2004, 09:04
Uitgedeelde bedankjes: 18 keer
Bedankt: 16 keer

Code: Selecteer alles

Private sub Form_Load 
    do while bestand_niet_ten_einde
        lijn_naar_tabel
        Application.DoEvents()
        Progressbar.PerformStep
    loop
End Sub
Kenneth
Premium Member
Premium Member
Berichten: 511
Lid geworden op: 27 feb 2007, 11:31
Locatie: wervik
Uitgedeelde bedankjes: 1 keer
Bedankt: 6 keer

Code: Selecteer alles

        Dim lezer As New Microsoft.VisualBasic.FileIO.TextFieldParser(bestandBevolking)
        lezer.TextFieldType = FileIO.FieldType.Delimited
        lezer.SetDelimiters(";")
        lijn = lezer.ReadFields
       
        While Not lezer.EndOfData
            Try
                lijn = lezer.ReadFields
                If lijn(34) <> "" And lijn(5) <> "" Then
                    rij(0) = lijn(1)
                    rij(1) = lijn(3)
                    rij(2) = lijn(5)
                    rij(3) = lijn(6)
                    rij(4) = lijn(7)
                    rij(5) = lijn(34)
                    ds.Rows.Add(rij)
                    rij = ds.NewRow
                End If

            Catch ex As Exception

            End Try
         
            ProgressBar1.PerformStep()

            Application.DoEvents()

        End While

    End Sub


Zoiets dat je bedoelt? Hij heeft dit net geprobeerd maar maakt blijkbaar geen verschil uit.
nogChoco
Premium Member
Premium Member
Berichten: 713
Lid geworden op: 11 mei 2007, 20:02

De 'propere' oplossing, is het bestand laten inlezen door een BackgroundWorker die dan de progressbar update (dus via multi-threading).
Kenneth
Premium Member
Premium Member
Berichten: 511
Lid geworden op: 27 feb 2007, 11:31
Locatie: wervik
Uitgedeelde bedankjes: 1 keer
Bedankt: 6 keer

Ikzelf werk eigenlijk altijd met die backgroundworker. Maar vroeg me nu gewoon af waarom de code van mijn maat niet werkte.

De code is misschien niet op en top maar het resultaat is hetzelfde nl. alles wordt ingelezen en het resultaat is een tabel. Maar begreep niet echt waarom zijn manier het eigenlijk niet werkte. Maar blijkbaar wordt eerst het werk uitgevoerd en wordt dan pas het scherm ververst
nogChoco
Premium Member
Premium Member
Berichten: 713
Lid geworden op: 11 mei 2007, 20:02

Het Load event komt voor het Shown event, dus eigenlijk is de Form nog niet getekend bij het inlezen van het bestand tijdens het Load event.

Maar zelfs al zet je de inleescode elders, dan nog zal de Form haperen omdat de langdurige inleesbewerking op dezelfde processorthread zit als de Form en dus moet die wachten tot het inlezen voltooid is vooraleer painting updates mogelijk zijn.
BungaMan
Elite Poster
Elite Poster
Berichten: 1485
Lid geworden op: 16 nov 2005, 09:05

nogChoco schreef:Het Load event komt voor het Shown event, dus eigenlijk is de Form nog niet getekend bij het inlezen van het bestand tijdens het Load event.


klopt.

nogChoco schreef:Maar zelfs al zet je de inleescode elders, dan nog zal de Form haperen omdat de langdurige inleesbewerking op dezelfde processorthread zit als de Form en dus moet die wachten tot het inlezen voltooid is vooraleer painting updates mogelijk zijn.


daarvoor dient die Application.DoEvents() dus.

probeer het maar eens via een knop op het scherm.
Please help, looking for a way to get rich and fast
nogChoco
Premium Member
Premium Member
Berichten: 713
Lid geworden op: 11 mei 2007, 20:02

DoEvents wordt algemeen beschouwd als vieze truc, en zeker als het gaat om een GUI, omdat je de user dan de kans geeft al nieuwe dingen te starten terwijl alles eigenlijk aan het wachten is tot dat stuk code voltooid is (en alle nieuwe dingen die ondertussen in gang gezet werden).
noctris
Starter
Starter
Berichten: 10
Lid geworden op: 11 apr 2007, 16:15

Jou Code

Code: Selecteer alles

Private sub Form_Load
do while bestand_niet_ten_einde
lijn_naar_tabel
Progressbar.PerformStep
loop
End Sub


Vieze Truc:

Code: Selecteer alles

Private sub Form_Load
Me.show
do while bestand_niet_ten_einde
lijn_naar_tabel
Progressbar.PerformStep
appplication.doEvents()
'me.refresh -> dit werkt ook maar is nog intensiever
loop
End Sub


Correct zou inderdaad zijn om met een backgroundworker te werken. Kijk eens op codeproject.com, daar staan veel goede VB tutorials
Plaats reactie

Terug naar “Development”