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