Seite 1 von 1
verzögerte Initialisierung mit QDirModel und Netzlaufwerken
Verfasst: 26. Februar 2009 01:04
von Marcel
Hallo,
ich habe ein extrem nerviges Problem mit einem QDirModel, das durch einen QTreeView das komplette Dateisystem darstellt: die Initialisierung dauert nämlich (unter Windows), wenn nicht verfügbare Netzlaufwerke vorhanden sind, extrem lang.
Habe das Problem schon ziemlich lange (seit Qt 4.0) und mit jedem neuen Release vergeblich gehofft, dass das Problem endlich gelöst wird (auch mit der aktuellen Version 4.4 besteht es noch; 4.5 habe ich noch nicht probiert).
Die Bug-Meldung
http://www.qtsoftware.com/developer/tas ... y&id=87455 scheint das Problem zu beschreiben, aber bei mir tritt das Problem weiterhin auf.
In einem anderen Task (weiss leider nicht mehr welcher) wird empfohlen LazyChildCount einzuschalten. Aber auch das hat nichts gebracht.
Hat jemand vielleicht eine Lösung oder einen Workaround für dieses Problem gefunden?
Vielen Dank
Marcel
Verfasst: 26. Februar 2009 12:24
von CLRS530
Ich würde dir raten QFileSystemModel zu nutzen, das ist sozusagen eine Neuimplementation von QDirModel und es wird auch von den Trolls empfohlen dies einzusetzten, da es einiges besser machen soll und ua. Threads nutzt, also für dich auch an der Stelle hilfreich sein sollte.
Ich hatte mit QFileSystemModel trotz allem so meine Probleme und ich denke, das du dein Projekt gegebenenfalls leicht umbauen musst, aber gerade für die Zukunft wird sich das Nutzen der neuen Klasse sicherlich lohnen. Die Klasse gibt es auch erst seit Qt 4.4.
Verfasst: 26. Februar 2009 13:26
von Marcel
Vielen Dank. Werde ich ausprobieren.
Nach der Doku zu urteilen, die die Performance ja ziemlich betont, scheint das ja nun auch ihre endgültige Lösung für das Problem zu sein.
Verfasst: 27. Februar 2009 08:33
von pfid
Also mit QDirModel/QFileSystemModel habe ich auch schon rumprobiert; als Versuch für einen simplen Filemanager. Der erste Versuch mit 2 TreeViews zeigt aber bei beiden Models eine ziemlich schlechte Performance (unter Windows; Linux nicht getestet): Verzeichnisse mit viel Inhalt öffnen sich mit einer deutlichen Verzögerung, scrollen in einem solchen Verzeichnis ruckelt unerträglich.
Das mit den Netzwerklaufwerken konnte ich bei QDirModel auch beobachten, mit QFileSystemModel habe ich es seither nicht mehr probiert.
Verfasst: 27. Februar 2009 11:10
von CLRS530
Das kann ich so nicht bestätigen. Ich habe QDirModel sozusagen nachgebaut und auch am Anfang davon abgeleitet, da ich viel mehr Funktionalität brauche und es ist richtig, dass es bei großen Ordnern wie bspw mein System32 Ordner (hast du noch größere?) doch eine nervige Zeit zum Laden braucht. Aber Probleme beim Scrollen kann ich eigentlich nicht bestätigen, aber vielleicht habe ich auch mehr CPU Power

.
Ich habe mir auch schon überlegt, wohl von den vielen High Level Funktionen, wie die Benutzung von QDir zur Ordnersuche, runterzukommen. Das geht ja auch mit C++ Mitteln Plattformunabhängig.
Verfasst: 27. Februar 2009 12:01
von pfid
Code: Alles auswählen
#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>
#include <QVBoxLayout>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QWidget window;
QTreeView* view = new QTreeView(&window);
QFileSystemModel* model = new QFileSystemModel(&window);
model->setRootPath("/");
view->setModel(model);
window.setLayout(new QVBoxLayout());
window.layout()->addWidget(view);
window.show();
return app.exec();
}
Das hier hat ne spürbare Verzögerung bei den meisten Verzeichnissen. Wenn ich ein Verzeichnis aufklappe, so dass etwa 130 Widgets in der TreeView angezeigt werden, wird das scrollen träge. Wenn ich dann einen Ordner mit einem KDE Icon-theme öffne (../32x32/), gehe ich mal so weit um zusagen, dass das Scrollen unerträglich wird.
Wenn ich das gleiche mit z.b. pcmanfm oder thunar mache, ists kein Problem. Mit Dolphin ists in meinen Augen genauso träge.
Rechner: E6550 2.33GHz, 2GB, linux 2.6.27-11.
Mein Quadcore daheim sollte für solche Aufgaben denke ich auch "genug Power" haben, zumal das QFileSystemModel doch angeblich mit Threads arbeitet (wie auch immer selbige implementiert sind...)?
Naja, ich will nicht auf Qt rumhacken, wollte es nur an dieser Stelle erwähnt haben

Verfasst: 27. Februar 2009 15:06
von CLRS530
Nein ist doch cool über sowas zu schreiben. Ich arbeite derzeit an einem Multi Plattform 7zip, wenn du so willst und dafür ist es wichtig, dass das öffnen des Programmes mit einem beliebigen Pfad oder auch dem ändern von ordnern zügig von statten geht.
Man müsste halt auch erst rausfinden, wo die Performanceprobleme liegen. Ist es wegen dem Laden der Icons (entfällt bei Linux eigentlich komplett), wegen dem Durchsuchen der Ordner oder wegen sonstigem.
Das befüllen der QDir strukturen, wo QDirModel sie dann erst wieder ausliest und dann selbst speichert brauchtb einfach sehr viel Zeit. Wobei das die von dir angesprochenen Verzögerungen beim Scrollen nicht beschreibt.
Ich habe unter Linux bisher noch nicht soviel getestet, werde ich bei gelegenheit mal tun

Problem gelöst
Verfasst: 3. März 2009 23:44
von Marcel
Hallo,
also ich habe mein Programm nun auf das QFileSystemModel umgestellt und alles läuft auch mit nicht verfügbaren Netzlaufwerken rund.
Vielen Dank nochmal für den Hinweis
Marcel
Verfasst: 4. März 2009 07:32
von Christian81
CLRS530 hat geschrieben:Das geht ja auch mit C++ Mitteln Plattformunabhängig.
Aha - und wie bitte?
Verfasst: 4. März 2009 11:29
von CLRS530
Jup richtig, geht nicht

Ich war der Annahme FindFirstFile etc wären Teil des C++ Standarts oder eines Erweiterten. Dabei ist es Teil der Win32 API. Sorry für die Verwirrung. Ich tendiere dann eher dahin Boost zu verwenden, wobei ich da auch keine Informationen gefunden habe, ob es schneller sein sollte. Auf jeden Fall bietet es im Pfadmanagement mit der Rückgabe von Vektoren, die jeden Ordnernamen enthalten für meine Zwecke einiges mehr Flexibilität. Das wäre eine gute Neuerung für QDir. Eine neue Klasse QPath, die von absolutePath und weiteren zurückgegegeben wird, als Erweiterung zu QString. Das macht zwar erst einmal nichts schneller, kommt aber weiteren Verwendungen zugute.
Verfasst: 4. März 2009 12:35
von Christian81
QDir usw. sind nur relativ langsam weil sie nicht nur das lokale Dateisystem sondern eben auch noch nfs usw. mit abhandeln - so habe ich das zumindest verstanden.