Sleep(1)
-
Jochen Kalmbach schrieb:
@Badestarnd: Du hast das Problem nicht verstanden...
@vergessen: Du hast vergessen zu erwähnen, dass dies nur gemacht wird, wenn sich der Prozess im "normalen" Priority-Range ansiedelt (default).ja, man hätte expliziter erwähnen sollen,dass dieser Systemthread nur für den dynamischen Bereich zwischen den Prioritätsstufen 0-15 (nicht 18 *Hust*) - wie dann von dir beschrieben - gilt, wo ja eh die meisten normalen Programme laufen (sollten).
Die 'Echtzeit'-Prioritäten (dann zwischen 16-31) hebt oder senkt Windows niemals von sich aus. Die sind dann sozusagen statisch. Aber diese Prioritäten werden meist eh nur von wichtigen Systemthreads oder Treibern benutzt bzw. von Programmen wo es Sinn macht. (Zumindest meistens )grüsse
-
hustbaer schrieb:
z.B. wie Jochen uns gerade wissen liess wenn der Thread wo immer bloss "Sleep(0)" macht einem Prozess mit REALTIME_PRIORITY_CLASS gehört.
Wenn Du nur einen Prozessor hast und machst ein:
#include <windows.h> #include <tchar.h> int _tmain(void) { SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); while(true) Sleep(0); }
Dann darfst Du drei mal Raten ob Du anschliessend ohne den "Reset-Taster" zu betätigen das Programm beenden kannst
PS: Wenn Du zwei oder mehr Prozessoren hast musst Du den Prozess halt so viel mal starten, wie Du Prozessoren hast
-
Jochen Kalmbach schrieb:
PS: Wenn Du zwei oder mehr Prozessoren hast musst Du den Prozess halt so viel mal starten, wie Du Prozessoren hast
Oder man benutzt SetProcessAffinityMask
-
-
War nur ne kleine und allgemeine Anmerkung auf Mehrprozessorsysteme.Wenn das Progg dann mit mehreren Threads überall auslasten soll.Aber wurscht.
Fehlte allerdings noch SetThreadAffinityMask.
-
vergessen schrieb:
War nur ne kleine und allgemeine Anmerkung auf Mehrprozessorsysteme.Wenn das Progg dann mit mehreren Threads überall auslasten soll.Aber wurscht.
Wenn es "Auslasten soll", dann machst Du am besten gar nichts!!!
Mit den genannten Funktionen kannst Du nur was an Deinem Prozess einschränken. Also immer nur weniger Rechenzeit bekommen, aber nie mehr...
-
Jochen Kalmbach schrieb:
vergessen schrieb:
War nur ne kleine und allgemeine Anmerkung auf Mehrprozessorsysteme.Wenn das Progg dann mit mehreren Threads überall auslasten soll.Aber wurscht.
Wenn es "Auslasten soll", dann machst Du am besten gar nichts!!!
Mit den genannten Funktionen kannst Du nur was an Deinem Prozess einschränken. Also immer nur weniger Rechenzeit bekommen, aber nie mehr...ahja! Na, wenn du das sagst...
-
mir fällt dabei auch wieder ein, warum ich hier meinen Nutzernamen vergessen hatte
-
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.