Sleep(1)
-
schuldigung, das ich mich hier so einfach einklinke.
Aber ich schreibe gerade an einer DLL, die 2 Threads beinhaltet. Der eine mit Sleep(500) sollte nicht problematisch sein. Aber mein IO-Thread muss im millisekunden Takt am USB-Bus horchen. Wie genau stellt ihr euch das ohne Sleep(0) vor? Ich bräuchte da etwas völlig Signal unabhängiges, da dieser Thread IMMER pollt.
-
Windows ist auch nach 60 Beiträgen noch kein Echtzeit OS.
Warum willst Du den "pollen"??? Stell Dein System auf einen vernünftigen Event-Mechanismus um!
-
Würde ich gerne, ist aber von Linux vorgegeben. Danke. das mit dem keine Echtzeit, lag mir auch im Kopf. Danke
-
Aber mein IO-Thread muss im millisekunden Takt am USB-Bus horchen. Wie genau stellt ihr euch das ohne Sleep(0) vor?
Indem du einfach ganz normale blocking IO Calls verwendest, also ReadFile ohne OVERLAPPED? Irgendwie verstehe ich das Problem nicht, vielleicht kannst du es etwas genauer beschreiben - also was du machst und wieso du dich gezwungen siehst Sleep(0) zu verwenden...
-
hustbaer schrieb:
Indem du einfach ganz normale blocking IO Calls verwendest, also ReadFile ohne OVERLAPPED?
Nightstorm schrieb:
Würde ich gerne, ist aber von Linux vorgegeben
Gibts unter Linux nichts äquivalentes? Hab immer das Gefühl, dass sich viele Sachen unter Windows und Linux ähnlich behandeln lassen (jdnfalls mit den selben Mechanismen/Prinzipien)?
-
Wieso jetzt Linux hier, das ist das WinAPI Forum *verwirrt-sei*. Und klar gibts unter Linux blocking IO. Und wo es kein blocking IO gibt gibts ganz sicher was äquivalentes zu completion Ports. Darf ja auch ne normale Callback Funktion sein, wurscht, auf jeden Fall muss man nicht pollen.
Auf Pollen sind nämlich viele allergisch, huch, welch WortwitzMacht ausserdem wenig Sinn eine Linux Frage in diesem Thread zu stellen, da Sleep(0) unter Linux nicht notwendigerweise das selbe macht wie unter Windows, wobei ich fast davon ausgehe dass die entsprechende Funktion dort (Linux) anders heisst.
-
sorry, das ich euch verwirrt habe.
Ich schreibe an der Übersetzung einer Linux-Bibliothek auf Windows.
Das Backend ist schon fertig spezifiziert, und liefert nur auf meine Anfrage eine Antwort. Wenn ich kein Sleep(x) verwende, weiß ich nicht wie ich meine Threads reanimieren soll. Allerdings sehe ich polling nach diesem Thread auch als Böse an.
Deshalb hatte ich mal nach einem konkreten Beispiel gefragt. Ihr werft irgendwelche Specs hin. Ein zwei erklärende Code-schnippsel sind schon immer was feines.
Ich habe auch nochmal mit dem Hauptentwickler geschrieben, und der währe mit Sleep(10) auch zufrieden. aber wenn ihr mir eine andere Möglichkeit aufzeigt, würde ich es gerne implementieren.
-
Naja, wenn du bloss alle 10 msec Fragst ob was passiert ist, dann wäre eine andere Möglichkeit die Gegenstellen (dort wo du nachfragst) so umzubasteln dass du dort einen Funktion hast, die du aufrufen kannst, und die erst zurückkommt wenn was passiert ist -- bzw. ein schon früher "passiertes" Ereignis gepuffert ist welches noch nicht abgeholt wurde. Das nennt man "blocking". USB unter Windows unterstützt blocking IO, von daher dachte ich mir das würde wohl die einfachste Möglichkeit sein.
Eine andere Möglichkeit wäre dass du von der Gegenstelle einen EVENT gesetzt bekommst wenn was passiert ist, oder, alternativ, der Gegenstelle eine Callback-Funktion angeben kannst, die eben immer dann aufgerufen wird.
Wenn dies alles nicht möglich ist, dann ist es u.U. OK ein Sleep(10) zu verwenden. Ich habe schon Code geschrieben wo alle 4 msec etwas gepollt wird *duck*. Merkt man aber so-gut-wie nix davon dass das läuft. Wenn davon 10 Instanzen laufen würden wäre es schlecht. Läuft aber nur eine, und wird immer nur eine sein, von daher ist es entschuldbar. Polling ist IMHO unter gewissen Umständen eine sehr gute Lösung, vor allem weils einfach und "deppensicher" ist.
Also. Wenns einfach geht: umbasteln, wenn nicht: Sleep(10) lassen.