000
10.07.2008, 13:42 Uhr
blablub
|
Hallo
Was ich vorhabe: Ich möchte eine Bibliothek (in C++) schreiben die einige Systemaufrufe von Win32 und Linux objektorientiert abstrahiert. Es soll damit also möglich sein, systemunabhängige Programme zu schreiben. Abstrahiert werden sollen u.a. Io-Streams (Pipes, Files, Tcp-Sockets), Threads, Muteces etc und Udp-Sockets. Der Unterschied zur Standardbibliothek + Boost soll aber eine Funktion sein, die ähnliche Funktionalität wie "select(...)" unter Linux bietet. Im Pseudocode sieht die Funktion ungefähr so aus: update(List-Of-Updateable-Objects,Timeout). Sie soll so lange blockieren, bis der Status eines oder mehrerer Objekte (IoSrteams, Threads, Sockets, ...) aktualisiert wurde oder der Timeout abläuft. Der Status eines Input-Streams z.b. könnte sein, ob das Lesen blockieren würde oder nicht und ob das Ende des Streams erreicht ist. Unter Linux werde ich "select(...)" verwenden. Unter Windows erscheint mir "WaitFormultipleObjects(...)" angebracht zu sein.
Anmerkung: Im Gegensatz zur Standardbibliothek soll die Read-Funktion meines Input-Streams nicht eine bestimmte Anzahl von Werten lesen, sondern ähnelt eher der nie wirklich implementierten Funktion "readsome(...)" des std::istreams (ich meine jedenfalls, dass da mal sowas war).
Das Problem: Ich habe unter Windows die Standardeingabe in einem Input-Stream gekapselt. Falls "WaitForMultipleObjects(...)" das entsprechende Handle markiert, gehe ich davon aus, dass ein Aufruf von "ReadFile(...)" nicht blockieren würde, ändere also den Status des Input-Streams. Das scheint aber nicht immer der Fall zu sein. Beim Testen mit der Konsole als Standardeingabe hat "WaitForMultipleObjects(...)" schon beim Drücken von "strg" das Handle markiert.
Die Frage: Kann ich die Handles irgendwie so einschränken, dass ein Aufruf von "WaitFormultipleObjects(...)" nur das Handle markiert, wenn "ReadFile(...)" nicht blockieren würde? Oder falls das schwierig ist, gibt es eine andere Funktion, die im Zweifelsfall prüfen kann, weshalb das Objekt markiert wurde?
Bis jetzt habe ich mich nicht mit solchen Systemeigenheiten auseinandersetzen müssen, weil ich einfach die Standardbibliothek und Boost verwendet habe. Doch solch ein Feature habe ich immer vermisst. Da ich keine Lust habe mich in alle Feinheiten der Winapi einzulesen, hoffe ich auf Vorschläge, Ideen, Links oder einfach nur suchbare Stichpunkte eurerseits. |