Aktionen in die normale GUI Nachrichtenschleife einfügen
-
Gibts dafür möglichkeiten? Es geht darum das ich große Datenmengen zu laden habe. Bisher lade ich den gesamten Block an Daten einmal, was zu starker verzögerung im GUI ablauf führt. Prinzipiell sind diese Daten zwar wichtig, aber sollten die GUI nicht so lange blockieren. Die Daten kann ich auch in Teilblöcken laden. Aber wie Synchronisiere ich das mit der GUI? Kurzum. Ich möchte einen Teil der Daten laden. Füge diese Daten in die Oberfläche ein und möchte das diese nun neu gezeichnet wird (Und weitere Events abarbeitet). Dann will ich mit den nächsten Teil der Daten fortfahren. Wie kriege ich sowas hin? Kann ich funktionen in das Eventhandling der GUI einfügen?
-
Naja du könntest dich mal mit Rx beschäftigen, um die Sachen einfach asynchron zu laden.Alles weitere schau dir einfach mal an
-
es ist faszinierend für was es alles immer gigantische Frameworks gibt - was sonst mit einfachen Mitteln ebenfalls zu erreichen ist ... Delegaten ist das Stichwort
-
Zu den Frameworks: Ich bin an sehr enge richtlinien gebunden. Daher kann ich nicht einfach mal ein Framework verwenden. Ich werd schon zu tun haben das Framework für die GUI sache durchzuboxen.
Das mit den Delegates hab ich mir auch schon gedacht. Aber wenn ich ein einfaches Asynch mit BeginInvoke() loslege wird das doch wohl in einen Seperaten Thread gepackt, auf alle fälle kommt sehr schnell eine Exception.
-
Jo hast du Recht mogel. Ich dachte mir nur, es wäre ne Interessante Sache sich damit mal zu beschäftigen, weil es halt schon extrem cool ist und auch immer mehr genutzt wird. Aber mit dem Delegate haste Recht.
-
Ich erklär mal näher was ich machen möchte, ggf hilft das ein paar Lösungsansätze zu finden.
Ich habe eine art Load On Demand Mechanismus, der mir Blockweise Daten liefern kann.
Wenn ich also Laden will krieg ich eine bestimmte Anzahl an Blöcken. Für diese Blöcke kann ich mir nun die Daten holen.DataBlock[] db = DataHolder.GetBlocksToLoad(..); foreach(DataBlock block in db) { DataSet[] ds = DataHolder.LoadDataForBlock(block); foreach(DataSet set in ds) { DataSetView.add(set); } }
Das oben ist jetzt CS-Pseudocode der die wichtigste Funktionsweise erklärt. Das Problem ist einfach das während des gesamten ladens Das View nicht aktualisiert wird, im Grunde die ganze GUI stillsteht bis all das abgeschlossen ist. Kurz gesagt, der GUI Thread kommt erst wieder an die Reihe wenn alle Daten da sind. Das will ich halt entkoppeln. Ich möchte das so machen das nach jeden DataBlock erstmal kurz der GUI Thread dran kommt, und dannach der nächste DataBlock geladen wird, bzw wäre es noch besser wenn das LoadDataBlock läuft während die GUI auch arbeiten kann, und wenn LoadDataBlock fertig ist, werden die Daten in die GUI eingefügt und der nächste Block wird geladen.
-
Versuchs mal mit dem BackgroundWorker.
-
Firefighter schrieb:
Versuchs mal mit dem BackgroundWorker.
ai ... und wenn Du das ProgressChangedEventArgs beerbst, kannst Du das Event missbrauchen um den geladenen Datenblock an die GUI weiter zu reichen
-
Das Klingt doch schonmal recht interessant. Mal schauen ob ich das so hinbekomme, muss leider erstmal noch was anderes basteln, kann also sein das ich den Thread irgendwann nochmal hochgrabe wenn sich näheres ergibt.
Besten dank schonmal für den guten Ansatz.