Hallo,
ich habe mir die Schnittstellen zum iowkit angesehen und festgestellt, dass die Bibliothek zwar mehrere IoWarriors handhaben, aber nicht gleichzeitig von allen wartend Lesen kann.
Zumindest unter Linux ist es möglich - sofern man direkt über die devices zugreift - mittels select() auf eine/mehrere Veränderungen zu warten. Ist das unter Windows auch möglich und könnte man nicht die API entsprechend erweitern? Für jeden IoWarrior einen extra Thread aufzusetzen ist zwar möglich, aber...
Ciao
Hiasl
Gleichzeitiges Lesen mehrer IOWs ohne polling
Moderator: Guido Körber
Hallo hiasl,
ja wenn es unter Vista endlich ein select() geben würde, könnte man sich das Upgrade von XP glatt überlegen :-)
Mit der Funktion IowKit.ReadNonBlocking() kommt man aber eigentlich auch ganz gut zurecht.
Ein einzelner Thread fragt alle IOWarrior nach neuen Daten ab, wenn man bei keinem der Geräte etwas lesen konnte, legt man den Thread für einige Zeit schlafen.
Die minimale Zeitspanne zwischen 2 Reports vom IOWarrior ist festgelegt(8ms Iow24/40 ; 1ms Iow56). Weiterhin werden 128 Reports gepuffert. Wenn man also nicht darauf angewiesen ist extrem schnell auf Reports zu reagieren, könnte man den Thread durchaus mal 100ms schlafen legen.
Eberhard
ja wenn es unter Vista endlich ein select() geben würde, könnte man sich das Upgrade von XP glatt überlegen :-)
Mit der Funktion IowKit.ReadNonBlocking() kommt man aber eigentlich auch ganz gut zurecht.
Ein einzelner Thread fragt alle IOWarrior nach neuen Daten ab, wenn man bei keinem der Geräte etwas lesen konnte, legt man den Thread für einige Zeit schlafen.
Die minimale Zeitspanne zwischen 2 Reports vom IOWarrior ist festgelegt(8ms Iow24/40 ; 1ms Iow56). Weiterhin werden 128 Reports gepuffert. Wenn man also nicht darauf angewiesen ist extrem schnell auf Reports zu reagieren, könnte man den Thread durchaus mal 100ms schlafen legen.
Eberhard
Nunja, zu Vista schweige ich lieber mal ;)
Könnte das nicht die Bibliothek OS-abhängig übernehmen? Im Falle Linux (und Mac? Ist doch bestimmt Posix) select() und bei Windows ein interner Thread, der fröhlich pollt. "IowKitMultiRead" klingt doch toll, oder? :) Liefert einfach ein handle + Report und die Sache passt.
Könnte das nicht die Bibliothek OS-abhängig übernehmen? Im Falle Linux (und Mac? Ist doch bestimmt Posix) select() und bei Windows ein interner Thread, der fröhlich pollt. "IowKitMultiRead" klingt doch toll, oder? :) Liefert einfach ein handle + Report und die Sache passt.
Eine solche Funktion in einer eigenen Anwendung zu implementieren ist eigentlich auch nicht so schwierig
Als Parameter
Ein Array von Handles für die IOWarrior,
Zeiger auf ein Handle für den IOWarrior von dem evtl.gelesen wurde,
Zeiger auf einen Datenpuffer in den evtl. neue Daten geschrieben werden
Return true wenn was gelesen wurde.
In der Funktion auf alle Handle ReadNonBlocking machen.
OS-Unabhängig ist immer schwierig.
wenn man z.B. feststellen will ob ein IOWarrior eingesteckt oder entfernt wurde ist das unter Linux (dank udev) ein Klacks. Unter windows muß man da einige Klimmzüge machen.
Eberhard
Als Parameter
Ein Array von Handles für die IOWarrior,
Zeiger auf ein Handle für den IOWarrior von dem evtl.gelesen wurde,
Zeiger auf einen Datenpuffer in den evtl. neue Daten geschrieben werden
Return true wenn was gelesen wurde.
In der Funktion auf alle Handle ReadNonBlocking machen.
OS-Unabhängig ist immer schwierig.
wenn man z.B. feststellen will ob ein IOWarrior eingesteckt oder entfernt wurde ist das unter Linux (dank udev) ein Klacks. Unter windows muß man da einige Klimmzüge machen.
Eberhard
Du hast recht, das ist nicht wirklich schwer zu implementieren.
Nach meinem Verständnis ist das halt eigentlich Treibersache. Zumal es sonst ja jeder implementieren muss, der mehrere IOWs am Start hat (und pollen für ungünstig hält). Und die Kaskadierbarkeit von bis zu 8/16(?) Geräten ist doch gerade ein besonderes Merkmal.
Aber kein Problem, vielleicht bastle ich selber an der lib rum...
Nach meinem Verständnis ist das halt eigentlich Treibersache. Zumal es sonst ja jeder implementieren muss, der mehrere IOWs am Start hat (und pollen für ungünstig hält). Und die Kaskadierbarkeit von bis zu 8/16(?) Geräten ist doch gerade ein besonderes Merkmal.
Aber kein Problem, vielleicht bastle ich selber an der lib rum...
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Genau dafuer ist die Lib auch gedacht. Als Beispiel wie man es machen koennte, um eigene Implementierungen anzuregen.hiasl wrote:Aber kein Problem, vielleicht bastle ich selber an der lib rum...
Die Iowkit-1.x-Library wird bestimmt nicht in diese Richtung weiterentwickelt.
Die 2.0 Library hhingegen wird Callbacks bei eintreffenden Daten haben und braucht daher man kein MultiRead. Intern wird das mit zwei Lesethreads pro IO-Warrior erreicht. Es wird allerdings noch bis weit ins naechste Jahr dauern bis da etwas fertig ist.