Autor |
Beitrag |
moloch
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Fr 16.07.04 09:40
Hallo,
ich habe ein Problem mit einem selbsterstellten Thread.
Die CPU ist bleibt ständig auf 100% und das ohne jegliche Funktion
Delphi-Quelltext 1: 2:
| while not terminated do begin end; |
wenn ich jetzt ein sleep einbaue, dann bewirkt das Wunder. Ist das denn der richtige Weg?
Delphi-Quelltext 1: 2: 3: 4:
| while not terminated do begin sleep(2000); function(x) end; |
moloch
Moderiert von Udontknow: Delphi-Tags eingefügt, Thread verschoben.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 16.07.04 09:50
Ja nu, was ist denn daran merkwürdig? Du hast einen Thread, der zu arbeiten hat, also nimmt er sich logischerweise auch alles, was an CPU-Zeit da ist. Wenn du zwei Threads laufen lassen würdest, ginge die CPU ebenfalls wieder auf 100%, nur teilen sich die beiden nun die CPU-Zeit. Windows teilt den Threads eben die komplette Leistung zu, wenn keine anderen Anforderungen von anderen Threads/Prozessen kommen.
Wenn du den Thread dann für 2 Sekunden schlafen legst, macht er natürlich nichts mehr, die CPU-Last geht runter.
Cu,
Udontknow
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Fr 16.07.04 10:38
Ich verwende immer Sleep(1), da das ein ganz guter Wert ist, CPU wird nicht ausgelastet, Thread nicht unnötig ausgebremst.
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 16.07.04 10:43
Er wird nicht unnötig gebremst? Das sehe ich aber anders. Wenn der Thread eine einfache Aufgabe wie das Inkrementieren eines Integers hätte, kämst du nach einer Sekunde nur auf einen Wert unter Tausend. Mach das gleiche mal ohne Sleep.
Das Sleep ist doch völlig unnötig. Warum soll denn die CPU nicht ausgelastet werden? Wenn andere Prozesse/Threads CPU-Zeit brauchen, zwackt Windows da schon was ab. Und wenn tatsächlich euer Thread andere Vorgänge blockiert zu viel Rechenpower zieht, könnt ihr besser die Priorität senken.
Cu,
Udontknow
Zuletzt bearbeitet von Udontknow am Fr 16.07.04 10:45, insgesamt 1-mal bearbeitet
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Fr 16.07.04 10:44
Meistens ist es aber sinnlos die gesammte Kapazität zu verwenden, vorallem in Notebooks, beidenen die CPU den Akku beansprucht.
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 16.07.04 10:46
Hä?  Wieso sinnlos beansprucht? Ein Thread, der nichts zu tun hat, kann von mir aus schlummern, aber wenn doch aktiv was getan werden muss, wieso denn dann sleep?
Edit: äh, zu flott gelesen.  Also, ob ich jetzt für einen Prozess eine halbe Stunde bei 50% CPU-Last warte oder eine Viertelstunde bei 100%, dürfte nicht so wirklich einen Unterschied im Akku-Energiestand ausmachen. Und selbst wenn, der Zeitvorteil ist doch meist wichtiger als die marginale Energieverschwendung, zumal wohl die wenigsten immer mit ihrem Laptop im Garten sitzen (WLAN hin oder her), ganz zu schweigen von den nach wie vor vorhandenen Normalo-PC-Usern.
Cu,
Udontknow
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Fr 16.07.04 10:53
Stimmt auch wieder. Aber ein Programm das 100% Auslastung bensprucht, wir bei DAUs immer schuld am Rechnerabsturz sein  Ich finde es einfach schöner zu wissen, dass ich noch CPU Reserven hab 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 16.07.04 11:24
Wie gesagt, wenn die Priorität gesenkt ist, ist das System auch nicht ausgelastet, obwohl die CPU dann auf 100% steht.
Habe aus Spass mal eben oben erwähntes Beispiel nachgestellt, die Unterschiede sind viel dramatischer, als ich gedacht hatte!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TMyThread.Execute; var W2,W1:LongWord; begin inherited; W1:=GetTickCount; W2:=W1; While (not Terminated) and (W2-W1<1000) do begin if FSleep then Windows.Sleep(1);
W2:=GetTickCount;
Inc(Fi); end; Synchronize(Output); end; |
Obwohl ich sogar noch mehr tue als nur zu inkrementieren, kommen folgende Werte auf meinem Notebook (P4-2GHz) zustande:
Wert von FI bei Thread mit Sleep : 101.
Wert von FI bei Thread ohne Sleep: 51.864.516 !!!
Cu,
Udontknow
|
|
|