Frage

Ich wollte Fragen, ob es einen eleganten Weg, um die maximale CPU-Belastung für einen bestimmten thread zu tun intensive Berechnungen.

Jetzt habe ich die meiste Zeit verbrauchen Schleife im thread (nur Kompression), und verwenden Sie GetTickCount() und Sleep() mit hartcodierten Werte.Es stellt sicher, dass die Schleife, die für eine bestimmte Zeit, und als der Schlaf für einen bestimmten minimalen Zeit.Es mehr oder weniger macht den job alsogarantiert, dass der thread nicht mehr als 50% der CPU.
Allerdings Verhalten ist abhängig von der Anzahl der CPU-Kerne (großer Nachteil) und einfach nur hässlich (kleiner Nachteil :)).
Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich kenne keine API, um den OS-scheduler zu tun, was Sie wollen (auch wenn der thread ist der Leerlauf-Priorität, wenn es keine höhere Priorität bereit threads, bei Ihnen ausgeführt werden).Ich denke jedoch, dass man improvisieren kann eine ziemlich elegante throttling-Funktion basierend auf dem, was Sie bereits tun.Im wesentlichen (ich habe keinen Windows-dev-Maschine, praktisch):

Wählen Sie eine Standard-Zeit, die der thread Schlaf jede iteration.Dann, bei jeder iteration (oder auf jede N-te iteration, so dass die Drosselung Funktion nicht, selbst eine erhebliche CPU-Auslastung),

  1. Berechnen Sie die Menge der CPU-Zeit, die der thread verwendet, seit Sie das Letzte mal Ihre throttling-Funktion aufgerufen wurde (ich nenne diese dCPU).Sie verwenden können die GetThreadTimes() API, um die Zeit, die Ihre Faden ausgeführt wird.
  2. Berechnen Sie die Menge der reellen Zeit, die verstrichen ist, seit das Letzte mal Ihre throttling-Funktion aufgerufen wurde (ich nenne diese dClock).
  3. dCPU / dClock ist der Prozentsatz der CPU-Auslastung (eine CPU).Wenn es höher ist, als Sie möchten, erhöhen Sie Ihre Schlaf Zeit, wenn diese niedriger ist, verringern Sie die sleep-Zeit.
  4. Haben Sie Ihren thread Schlaf für die berechnete Zeit.

Je nachdem, wie Sie Ihre watchdog-berechnet die CPU-Nutzung, die Sie möglicherweise verwenden möchten GetProcessAffinityMask() um herauszufinden, wie viele CPUs der system.dCPU / (dClock * - CPUs) ist der Prozentsatz der gesamten CPU-Zeit zur Verfügung.

Sie werden immer noch haben zu Holen einige Magische zahlen für die erste Zeit schlafen und die Inkrement - /Dekrement-Menge, aber ich denke, dass dieser Algorithmus könnte abgestimmt werden, um halten ein Faden, der auf ziemlich nah an eine bestimmt Prozent der CPU.

Andere Tipps

Auf linux können Sie die scheduling-Priorität eines Threads mit schönen().

Ich kann nicht glauben, cross-Plattform, was Sie wollen (oder keine garantierte Möglichkeit, volle stop), aber als Sie mit GetTickCount-vielleicht haben Sie nicht daran interessiert sind, die cross-Plattform :)

Ich würde verwenden, Interprozess-Kommunikation und setzen die intensive Prozesse schönen Ebenen zu bekommen, was Sie verlangen, aber ich bin nicht sicher, dass ist geeignet für Ihre situation.

EDIT:Ich Stimme mit Bernard das ist der Grund, warum ich denke, dass ein Prozess, eher als ein thread besser geeignet sein könnten, aber es könnte nicht für Ihre Zwecke anpassen.

Das problem ist, es ist nicht normal, das zu wollen, zu verlassen, die CPU-im Leerlauf, während Sie etwas zu tun haben.Normalerweise setzen Sie ein hintergrund-task, um im LEERLAUF, Priorität, und lassen Sie das OS Griff Planung alle CPU-Zeit, die nicht verwendet wird, die durch interaktive Aufgaben.

Es Klang für mich wie die problem ist der watchdog-Prozess.

Wenn Ihre Hintergrundaufgabe ist CPU-gebunden, dann werden Sie wollen, es zu nehmen alle die nicht verwendete CPU-Zeit für die Aufgabe.

Vielleicht sollten Sie bei der Befestigung der watchdog-Programm?

Sie können zum ändern der Priorität eines Threads, aber das ändern der maximalen Auslastung würde entweder erfordern, polling und hacks zu begrenzen, wie viele Dinge im Gange sind, oder mit OS-tools, dass können die maximale Auslastung eines Prozesses.Jedoch, ich sehe keinen Umständen, wo würden Sie dies tun wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top