Ich ärgere mich schon länger darüber, wie lange es dauert, eine ListView zu befüllen.
Trotz Verwendung von _GUICtrlListView_BeginUpdate($idListView) und seinem Gegenstück, dauert es bei 1600 Datensätzen zu je 32 Feldern fast 10 Sekunden, bis man das Ergebnis in der Listview sieht.
Auf der Suche nach dem Zeitfresser staunte ich nicht schlecht, denn ich konnte den Verursacher nicht dingfest machen, wohl aber die Stelle, wo es klemmt.
Die folgende Routine ist zwar isoliert nicht lauffähig (bei Bedarf poste ich das ganze Programm, samt Datenbank), aber ich glaube man versteht bestens, was hier los ist:
Code
Func _ListViewFill($sSQLiteBefehl)
;# Hier wird die ListView mit den aus SQLite ausgelesenen Daten befüllt.
;# Je nach übergebenem $sSQLiteBefehl wird entweder nur ein einzelner Datensatz in die ListView eingefügt, oder es werden mehrere Einträge, oder gar
;# die komplette Datenbank, in die ListView übertragen.
;# Jeder Datensatz aus SQLite fließt dabei zunächst in das eindimensionale Array $aDatentaxi ein.
Local $hQuery
$sTmp = _GUICtrlListView_BeginUpdate($idListView) ;# Wir haben zeitintensives mit der ListView vor. Änderungen daher nicht instantan anzeigen.
Consolewrite("ListView Begin Update = " & $sTmp & @CRLF)
_GUICtrlListView_DeleteAllItems($idListView) ;# ListView komplett leeren.
_SQLite_Query(-1, $sSQLiteBefehl, $hQuery) ;# Die SQLite-Suchfunktion parametrieren ...
Local $i = 0
While _SQLite_FetchData($hQuery, $aDatentaxi, False, False) = $SQLITE_OK ;# ... anschließend fröhlich Suchtreffer ansammeln ...
GUICtrlCreateListViewItem(_ArrayToString($aDatentaxi, '|', 1, 21), $idListView) ;# ... und diese sogleich in die ListView schreiben ...
GUICtrlSetBkColor(-1, 0xF0E68C) ;# (0xF9F9F9) helles Grau (0xB9D1EA) helles blau (0xF0E68C) ;# ... und dort hübsch herrichten ...
$i +=1
GUICtrlSetData($idProgressbar1, $i) ;# ... außerdem die Fortschrittsanzeige aktualisieren ...
WEnd ;# ... bis nichts mehr gefunden wird.
ConsoleWrite("Der Fortschrittsbalken raste in der Schleife ruckzuck bis zum Anschlag, aber diese Konsolenmeldung hier, kommt erst nach Sekunden. Warum?" & @CRLF)
;# ### Klären: wie bekomme ich es hin, dass die ListView gefüllt angezeigt wird, sobald der Fortschrittsbalken rechts am Anschlag ist? ###
_SQLite_QueryFinalize($hQuery) ;# Beendet die SQL-Abfrage. ;# Zuletzt SQLite noch über unsere volle Befriedidgung informieren.
_GUICtrlListView_RegisterSortCallBack($idListView) ;### Klärungsbedarf! ###
$sTmp = _GUICtrlListView_EndUpdate($idListView) ;# Die ListView-Anzeige insgesamt aktualisieren.
Consolewrite("ListView End Update = " & $sTmp & @CRLF)
;# ### Warum lahmt es direkt nach der Schleife? ###
;# ### Es dauert bei 1600 Datensätzen noch rund 8 Sekunden, bis die Inhalte in der ListView erscheinen. Warum? ###
;# ### So wie es hier ist, ist die ProgressBar nutzlos! ###
EndFunc ;==>_ListViewFill
Alles anzeigen
P.S.: In der Codeauswahl des Forums ist "AutoIt" plötzlich nicht mehr verfügbar ...