Domino 9 und frühere Versionen > ND8: Entwicklung
Arbeitsweise von CSIViewPart
Ralf_M_Petter:
Damit meinte ich, dass du von 20.000 die meisten gar nicht liest und das sollte den grössten Performancesprung bringen. Problematisch wird es wenn du filtern bzw. Sortieren willst. Denn für sortieren solltest du ja die ganze View geladen haben. Lotus verwendet hier meiner Meinung nach undokumentierte Features des Java APIs um Views nach verschiedenen Sortierungen auszulesen. Wie das geht wüsste ich selber gerne.
Grüße
Ralf
Ralf_M_Petter:
--- Zitat von: Felix Ziegler am 02.03.09 - 15:20:55 ---
Ich muss der Tabelle doch mitteilen, wass sie anzeigen soll, oder etwa nicht?
--- Ende Zitat ---
Nein musst du nicht, bei virtuellen Tabellen sagtst du nur wie groß die Tabelle sein soll und implementierst einen Callback Listener den die Tabelle aufruft, wenn es für die Darstellung einer Zeile Daten braucht.
Grüße
Ralf
Felix Ziegler:
Ach so hast dus gemeint... Der Ansatz ist genial... Mal sehen ob ichs hin bekomm.
Wenn ich das sortieren auch noch geschafft hab, dann sag ich dir bescheid :D
Danke dir und noch nen schönen Nachmittag/Abend!
Ralf_M_Petter:
Felix hat mir ein paar Fragen in einer PM gesendet, die Antworten möchte ich aber lieber im öffentlichen Bereich geben, da ich denke die Antworten sind für mehr Leute interessant.
Erst mal die erste Frage:
Wie schafft man es die Notesarbeit in einen eigenen Thread auszulagern ohne dass man in dem Backgroundthread immer wieder für Notes initialisieren muß.
Ich habe es so gelöst, dass ich zuerst ein Interface (NotesWork) erstellt habe mit einer Methode run(Session ses);
Weiters habe ich eine Klasse (NotesWorkerThread) erstellt die von der Klasse Thread erbt. In dieser Klasse habe ich in der Run Methode die beim Thread start aufgerufen wird, zuerst dass Notes Environment initialisiert und dann eine Endlosschleife programmiert. In dieser Schleife wird immer eine LinkedList überprüft, ob Sie Objekte enthält, wenn ja wird das älteste Objekt, dass die Schnittstelle NotesWork implementieren muß geholt und die Methode run ausgeführt. Wenn die Methode run fertig ist, habe ich die Session recycelt und eine neue erstell und warte wieder auf einen Eintrag in der LinkedList.
So laufen alle Zugriffe auf Notes in einen eigenen Thread und man blockiert nicht den Eventloop Thread des Guis.
Ich habe das ganze bei uns dann noch so erweitert, dass man eine beliebige Anzahl von NotesWorkerThread laufen lassen kann, die über eine eigene Klasse als Threadpool verwaltet werden. Die kümmert sich dann auch um die Generierung der Threads und eventuell der Vernichtung falls ein Thread auf einen Fehler stosst.
Um optimale Performance in Felix Fall zu erreichen, müsste man dann auf die Allgemeine Gültigkeit der Klassen verzichten und das Interface eventuell so gestalten, dass statt der Session eine View übergeben wird. Dann darf natürlich die Session nicht recycelt werden. Bitte dann aber unbedingt gewährleisten, dass immer alle Objekte die nicht mehr benötigt werden recycelt werden, da man sich sonst ganz fiese Memory Leaks einhandelt.
Wenn man Daten aus dem NotesThread an das Gui übergeben will, muß man natürlich mit Display.asyncExec arbeiten.
@Felix Versuch mal das Konzept umzusetzen und Posten dann deinen aktuellen Source, dann kann ich dir bei der Implementierung der Callbacks helfen. Ich habe meine virtuellen Tabellen in meiner RCP schon fertig und sie performen wirklich gut. Die Antwortzeiten bei der Erstellung der View sind von mehreren Sekunden auf Millisekunden verbessert worden. Es zahlt sich also aus.
Grüße
Ralf
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln