Pagina 1 van 1

Visual Basic .net : form niet zichtbaar tijdens uitvoeren

Geplaatst: 26 jun 2008, 14:12
door Kenneth
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

Geplaatst: 26 jun 2008, 14:24
door khsw

Code: Selecteer alles

Private sub Form_Load 
    do while bestand_niet_ten_einde
        lijn_naar_tabel
        Application.DoEvents()
        Progressbar.PerformStep
    loop
End Sub

Geplaatst: 26 jun 2008, 15:06
door Kenneth

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.

Geplaatst: 26 jun 2008, 15:09
door nogChoco
De 'propere' oplossing, is het bestand laten inlezen door een BackgroundWorker die dan de progressbar update (dus via multi-threading).

Geplaatst: 27 jun 2008, 09:17
door Kenneth
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

Geplaatst: 27 jun 2008, 14:47
door nogChoco
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.

Geplaatst: 27 jun 2008, 22:51
door BungaMan
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.

Geplaatst: 28 jun 2008, 01:52
door nogChoco
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).

Re: Visual Basic .net : form niet zichtbaar tijdens uitvoere

Geplaatst: 18 jul 2008, 12:18
door noctris
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