Asynchronous I/O
-
Hallo!
Ich schreibe gerade ein Programm, dass Daten live über verschiedene Schnittstellen aufnimmt, verarbeitet, speichert und darstellt. Im Moment ist das ganze noch single-threaded, was an sich bei dem Datenaufkommen auch kein Problem ist, aber natürlich haben sich die GUI und das Datenaufkommen im Clinch. Will meinen, wenn ich gerade neu zeichne, dann verzögert das die Datenverarbeitung und andersherum. Außerdem arbeite ich auch mit verschiedenen Timern und während sich die Daten-Timer schnell abhandeln lassen, verzögert der Neu-Zeichnen-Timer alle restlichen. Daher möchte ich mindestens mal die Datenverarbeitung in einen anderen Thread auslagern. Am liebsten möchte ich Overlapped-Operation mit APCs verwenden (weil das so schön einfach funktioniert).Dazu habe ich mir zwei Möglichkeiten herausgesucht:
1. Ich erzeuge genau einen weiteren Thread, der nur für die Datenverarbeitung zuständig ist. Der wartet immer im alertable state (*WaitForMultipleObjectsEx oder so) und dann werden die APC's in seinem Kontext ausgeführt. Natürlich müssen die Operationen auch in seinem Kontext gestartet werden, daher kommt in diesem Thread ganz schön viel zusammen. Hier kann ich auch wunderbar Timer-getriebene Vorgänge durchführen, wie ich es bereits gewohnt bin.
2. Ich benutze die Thread-Pool-API und verbinde die Asynchronen IO Operationen mit dem IO Completion Port des Thread-Pools. Das erscheint mir ideal skalierend und überhaupt am passendsten, weil dann IO-Events einfach in irgendeinem freien Thread ausgeführt werden (über die Möglichkeit soetwas "per Hand" zu machen hatte ich schon vorher nachgedacht, aber dann die Arbeit gefürchtet). Meinem Verständnis nach muss ich dann noch nicht einmal darauf achten, im Kontext welchen Threads ich die IO-Operationen überhaupt starte. Den GUI-Kram und dessen Timer würde ich dann weiterhin im Hauptthread verwenden, so wie ich das jetzt auch schon mache. Zwei Probleme allerdings: Kann man auch Timer-APC's irgendwie mit dem Thread-Pool "verbinden"? Ich habe dazu so nichts gefunden. Anderes Problem: Ich habe vereinzelt darüber gelesen, dass die Windows-XP-Implementierung der Threadpools allgemein nicht mehr verwendet werden sollte, aber die genauen Gründe nicht so recht verstanden. Ist da etwas dran? Die Software soll auf einem alten XP-Notebook (aber neuestes Servicepack) laufen...
Ach und dann noch ein weiterer Gedanke: Diese Thread-Pool-Lösung kommt mir verdächtig viel zu einfach vor, muss ich da mit riesigem Betriebssystem-seitigem Overhead rechnen?
Über Eure Einschätzung würde ich mich sehr freuen. Bis dahin ersteinmal einen schönen Abend!
Deci