wxWidgets Events Prioritäten
-
hallo,
ich habe einen (datei-)such/find-thread programmiert und das funktioniert auch schon alles recht gut :D, außer wenn ich nach vielen dateien suche (extrem bsp C:\. ). der thread ruft ein event meiner wxFrame auf und übergibt die gefunde datei. bei sehr vielen dateien nehme ich an, dass die eventqueue sehr lang wird und die frame deswegen einfiert und erst nachdem die ganzen threadsevent abgearbeitet sind reagiert.meine frage:
kann ich irgendwie eventpriorität setzen sodass die threadevents in der schlange noch hinten rutschen oder ist die synchronisation über event eigentlich fuscherei?bei delphi gibs ja sowas wie synchronize(...) aber das mit den criticalsections check ich irgendwie nicht 100pro...
-
Hm, denke das es evtl. besser ist wenn du nicht für jede datei einen extra event auslöst.
Evtl. schickst du nur für jeden Ordner einen Event, oder für jeweils x Dateien einen.
Kommt auch drauf an, was du im Event handler machst.phlox
-
mmh das mit dem ordnerweise senden hatte ich schon gemacht hat aber fast nix gebracht.
das mit den x datei ist schon schwieriger, weil ich ja nicht vorhersehen kann viel er findet ;-). das müsste dann irgendwie zeitabhängig sein(dritter thread??).
ich probiere z.Z. gerade das ganze mit einem funktionszeiger aus (in der hoffung das er auch wirklich nur dann weitersucht wenn die betreffende datei in der liste steht.
aber das ganze funktioniert aufgrund SIGSEV problemen nicht.
auch folgender code behebt das problem nicht.wxCriticalSection csLocker; csLocker.Enter(); ... csLocker.Leave();
jemand eine idee?
muss ich die übergeben variable vorher klonen?
Wie?
-
Nene, mach das über Events, direkt auf GUI aus dem Thread zuzugreifen ist ne schlechte Idee.
Naja, das mit den x Dateien ist garnicht so schwer. Dein Thread erstellt einfach immer wenn ein Zähler größer x ist einen entsprechenden Event, hängt die Dateiliste darein, und schickt das dann weg. Löscht die lokale Liste, und der Spass geht von vorne los.
Ist der Thread fertig, muss er nur noch den Rest schicken://Pseudocode: void MyThread::FindFile(wxString filename) { //std::vector<wxString> vec; vec.push_back(filename); if(vec.size() == 100) {/* Event erstellen und versenden */vec.clear();} }
Kennst du die Klasse wxDirTraverser? Die ist für sowas gemacht, evtl. erstellst du so eine Klasse einfach, und lässt sie einfach im Thread laufen.
phlox
-
Die Such-Geschwindigkeit hängt auch sehr stark vom Dateisytem+Festplatte ab, d.h. wenn du auf mehr als einer physikalischen Festplatte suchst, lohnt es sich für jede einen eigenen Thread aufzumachen. Moderne SSD-Platten unterstützen bis zu 50.000 gleichzeitge I/O-Operationen eine normale Scheiben-Festplatte ist bei 2-3 gleichzeitigen Random-Seek-Operationen schon gut bedient.
Vielleicht habe ich den Post hier falsch gelesen, aber ich vermute ein "SafeYield" könnte dir helfen, d.h. nach jeder Datei, Ordner einfach mal Yield() am besten mit dem "Fenster/Dialog" der den Fortschritt anzeigt ... dann könntest du auch einfach deine Liste/Vektor abarbeiten und mußt nicht events weiterschicken, geschweige denn Threads benutzen.
Ich hatte mal in wxWidgets einen Sequioa-Clon geschrieben. Alles in einem Thread implementiert.