konstante CPU-Last erzeugen
-
Vergesst mal alle diesen ganzen prioritäts-quatsch wieder... das ist Windows kein echtzeit OS. Wenn der Sheduler meint pagefile durch die gegend schieben, das zeug was der USB driver grad macht, My Documents nach Redmond schicken, ... sei gerade wichtiger ist das so und das wird dann auch gemacht. Den interessiert nicht das dein tool jetzt in die bedrulie kommt mit timestamps generieren.
Aus eigener Erfahrung: lass das sein. Kauf dir irgend nen billig chip, schreib ein kleines timestamp-generier-programm und stöpsle ihn zwischen SPS un PC.
Solche sachen auf windows machen kannst du komplett vergessen, das bleibt ein Glückspiel anbänhig von HDD, RAM, CPU, GPU, Wetter, Winstärke... und kommt mit voller wucht wieder zurück sobald dem Kunden klar wir was für ein labiles konstrukt du ihm da andreht hast (hab windows auch schon mal als real-time OS missbrauchen wollen, deshalb: LASS ES SEIN!!!)
-
Ich hab da keine Entscheidungsgewalt. Jeder weiß hier, dass das Quatsch ist das so zu machen. Niemand hat aber die Zeit, das ins Realtime zu ziehen
-
gibt real time layer für windows. zeitkritische anwendungen für windows zu entwickeln ist zwar banane, aber billig ^^
-
dEUs schrieb:
Ich hab da keine Entscheidungsgewalt. Jeder weiß hier, dass das Quatsch ist das so zu machen. Niemand hat aber die Zeit, das ins Realtime zu ziehen
Ok
Dann versuch ich mal auch was produktives beizutragen: krahm dein alle x ein sleep programm noch mal raus und mach ein
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
SetProcessPriorityBoost(GetCurrentProcess(),TRUE);
vorne ran.
-
thordk schrieb:
gibt real time layer für windows. zeitkritische anwendungen für windows zu entwickeln ist zwar banane, aber billig ^^
Ich weiß. Auch dafür hat niemand Zeit.
-
CMatt schrieb:
dEUs schrieb:
Ich hab da keine Entscheidungsgewalt. Jeder weiß hier, dass das Quatsch ist das so zu machen. Niemand hat aber die Zeit, das ins Realtime zu ziehen
Ok
Dann versuch ich mal auch was produktives beizutragen: krahm dein alle x ein sleep programm noch mal raus und mach ein
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
SetProcessPriorityBoost(GetCurrentProcess(),TRUE);
vorne ran.Hilft auch nix...
-
dEUs schrieb:
CMatt schrieb:
dEUs schrieb:
Ich hab da keine Entscheidungsgewalt. Jeder weiß hier, dass das Quatsch ist das so zu machen. Niemand hat aber die Zeit, das ins Realtime zu ziehen
Ok
Dann versuch ich mal auch was produktives beizutragen: krahm dein alle x ein sleep programm noch mal raus und mach ein
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
SetProcessPriorityBoost(GetCurrentProcess(),TRUE);
vorne ran.Hilft auch nix...
Das du ein dual core system? (auf meinem single core reduzieren die 2 zeilen von oben as steurung nähmlich von ~20% auf 5)
-
Nein, ein single core.
Zeig mal den ganzen Code von dir.
-
int main() { SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); SetProcessPriorityBoost(GetCurrentProcess(),TRUE); while(1) { for(int x=0;x<999999;x++); Sleep(1); } return 0; }
als debug compliert, damit der compiler das unnütze zeug nicht einfach raus-optimiert => erbit ne last von 20-25% bei mir
(wobei ich von der Last spreche die im task manager angezeigt ist, also durschnitt, in echt sind das nählich keine 20% CPU load sondern 999999 mal vollgas dann 1ms pause)
-
Ich schmeiß auch mal was in die Runde:
DMA bei der Platte ausschalten und Dateien hin und her kopieren, k.A. ob das evtl. ne halbwegs konstante CPU-Last erzeugt...
-
Folgendes scheint gut zu klappen, auch ohne riesige Mengen von Threads.
10 Threads: 3% CPU-Auslastung
50 Threads: 35% CPU-Auslastung
100 Threads: 80% CPU-Auslastung#include <windows.h> #include <iostream> #include <cmath> float x; DWORD WINAPI threadProc(void*) { while(true) { for(int i = 0; i < 1000; i++) { x += sinf(x); x *= sqrtf(fabsf(x)); x /= cosf(x) + 1.0f; x = powf(fabsf(x), 2.75f); } Sleep(1); } } int main() { for(int i = 0; i < 100; i++) { DWORD id; CreateThread(0, 16, threadProc, 0, STACK_SIZE_PARAM_IS_A_RESERVATION, &id); } std::cin.get(); return 0; }