Threads in Multi-Core

Thomasio

Erfahrenes Mitglied
Ich habe eine Win32 Anwendung mit einer sehr grossen, rechenintensiven Funktion, die braucht bis zu 10 Sek. für einen Durchlauf.
Damit mir dabei nicht jedesmal das Fenster einfriert, habe ich diese Funktion in einen thread gepackt.
Ein paar Flags dazu gesetzt, und schon läuft das Ganze.

Trotzdem bin ich nicht ganz glücklich, weil je nach CPU Auslastung WM_PAINT Messages ins stottern kommen, sprich man sieht, dass da was langsamer geht als es sollte.
Die Idee ist nun, wenn der User eine Dual- oder QuadCore CPU hat, könnte man den Riesen-thread auf den zweiten Kern legen, so dass der Rest der Anwendung nicht stottert.
Allerdings ist das für mich völliges Neuland, ich habe ganz schlicht überhaupt keinen Plan wie ich

1) rausfinden kann welche CPU im Rechner steckt
2) rausfinden kann auf welchem Kern meine Anwendung läuft
3) CreateThread() auf einen bestimmten Kern legen kann

Google und MSDN sind auch nicht besonders ergiebig zum Thema, das Einzige was ich gefunden habe, sind ein paar Projekte mit dem Ziel dies zu erreichen, aber ohne Lösung.

Nachdem man im Windows Taskmanager jeden thread manuell auf einen bestimmten Kern legen kann, gehe ich mal davon aus, dass man das Ganze auch problemlos innerhalb der Anwendung machen kann, nur wie?
Wenn möglich in API plain.
 
Nachdem Du einen thread erzeugt hast, entscheidet das System, wo dieser Thread läuft. AFAIK hast du da als Programmierer keinen Einfluß. Wenn du ein Dual-Core-System hast, kannst du das einfach beobachten:
Starte keinen neuen Thread, sondern lasse Deine Berechnung im Hauptthread laufen. Wenn du jetzt den Taskmanager öffnest, wirst du im Reiter 'Systemauslastung' sehen, daß nur ein Core beansprucht wird. Wenn du die Berechnung in einem eigenen Thread laufen lässt, wird Du sehen, dass beide Cores belastet werden.
 
Trotzdem bin ich nicht ganz glücklich, weil je nach CPU Auslastung WM_PAINT Messages ins stottern kommen, sprich man sieht, dass da was langsamer geht als es sollte.
Das sollte eigentlich nicht passieren. Falls der Thread eine sehr hohe CPU-Last erzeugt, kannst du das entschärfen, indem du Sleep()-Kommandos einfügst. Bei einer lange laufenden Schleife z.B. bei jedem Schleifendurchlauf.

Gruß
MCoder
 
Na, wenn es automatisch geht, wie jokey sagt, dann ist mein Wunsch schon erfüllt.
Das bedeutet dann, mein Stotter-Problem liegt woanders ...... da muss ich suchen.

Erstmal danke für die Hilfe.
 
Du solltest den Tipp von MCoder durchaus berücksichtigen. Wenn du nämlich in einem dualCore-System 3 Threads laufen hast, dann kann es eben passieren, daß der Zeichen-Thread und der Berechnungs-Thread sich gegenseitig in die Quere kommen. Du kannst natürlich dem Berechnungs-Thread eine geringere Priorität zuweisen. Dann braucht er zwar möglicherweise etwas länger, aber die Oberfläche wird schneller gezeichnet.
 
Habs schon gefunden, Problem war, dass das Ergebnis der Berechnung einen neuen WM_PAINT auslöst, der wiederum nicht mit einem Flag abgedeckt war, so dass ich 2 WM_PAINT simultan laufen hatte.

Bin halt noch Anfänger in Sachen multi-thread
 
Zurück