SEHR große Dateien (eventuell asynchron) einlesen

Alles rund um die Programmierung mit Qt
Antworten
jw202
Beiträge: 36
Registriert: 6. August 2012 22:25

SEHR große Dateien (eventuell asynchron) einlesen

Beitrag von jw202 »

Hallo

ich hätte ein Problem mit dem Einlesen von Dateien: ich habe einen bekannten Crypto-Algorithmus implementiert, welcher Blockweise Dateien verschlüsseln sollte. Das Problem ist, dass für das Einlesen von Dateien großteils nur Code-Fragmente finde, welche in einer Schleife so lange die Datei einlesen, bis alles gelesen wurde. Das funktioniert grundsätzlich wie gewünscht, allerdings reagiert die Benutzeroberfläche nicht mehr, da das Programm minutenlang mit der Schleife beschäftigt ist, welche die Datei einliest.

Ich hätte mir 2 verschiedene Lösungsmöglichkeiten überlegt:

1) Threads: Ist absolut selbsterklärend

2) Asynchroner Zugriff: es gab ja mal eine Klasse QFtp, welche mit großen Files problemlos umgegangen ist. Gibt es auch so etwas für Dateien.


Meine Hoffnung ist es, dass ich die Threads-Methode umgehen könnte. Weiß da jemand was.

LG
Und danke schon im Voraus
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: SEHR große Dateien (eventuell asynchron) einlesen

Beitrag von RHBaum »

Es gibt, unter windows zumindest, assynchrones einlesen/Schreiben (IO operationen)
D.h. du schiesst deinen lesevorgang ab und registriest einen callback.
Dieser wird dann vom OS(scheduler) aus aufgerufen, und die Umgebung deines Prozesses dazu hergestellt, allerdings auch auf kosten der Rechenzeit vom Rest des Programms ...
Das funktioniert ähnlich wie SIGNALE(nicht die von Qt)
Die werden von aussen getriggert, und wenn dein Programm in einem unterbrechbaren Zustand ist, wird der Signalhandler aufgerufen.
der läuft im selben "context" des Programms, also im selben thread wo es registriert wurde , der normale Programmfluss wird erst nach abarbeiten des Handlers ausgeführt. - pseudo Assynchron !
Ist dein Programm singlethreaded (bei multithreaded progs macht sowas eher in Asunahmefällen Sinn), würde wahrscheinlich 100% der zugestandenen Zeit vom Scheduler mit der Reaktion auf den Callback usw. verbringen, aka dein GUI wuerde auch stehen.
Man koennte aber schon was mit der Prio machen, so das die EventQueue mit hoeherer Prio gefahren werden würde, dann wuerde deine GUI vielleicht auch nicht ganz so schlimm stocken ....
Hab ich aber auch noch nie gemacht.

Was Du dir aber generell ueberlegen solltest:
Verschluesselung ist meist blockweise. Das heisst du kannst bloecke parrallel auslesen und entschluesseln. Macht viel Sinn, wenn die Entschluesselung entsprechend lange dauert gegenüber der IO zum Auslesen der Rohdaten.
Da koenntest deinen Prozessor viel besser auslasten (mehrere kerne verwenden). Das geht mit multithreading/multiprozessing am besten.

Generell sind assynchrone funktionen zum umgehen von Multithreading und deren "Komplexitaet (Locking)"
Aber in Deinem Anwendungsfall würde Dir richtiges Multithreading doch noch mehr Vorteile bringen ...

Ciao ...
Antworten