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