Autor Beitrag
moloch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: 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

ausblenden 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?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  while not terminated do begin
    sleep(2000);
    function(x)
  end;


moloch

Moderiert von user profile iconUdontknow: Delphi-Tags eingefügt, Thread verschoben.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 16.07.04 10:46 
Hä? :shock: 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. :oops: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Fr 16.07.04 10:53 
Stimmt auch wieder. Aber ein Programm das 100% Auslastung bensprucht, wir bei DAUs immer schuld am Rechnerabsturz sein :mrgreen: Ich finde es einfach schöner zu wissen, dass ich noch CPU Reserven hab :wink:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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! :shock:

ausblenden 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<1000do
  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 !!! :shock:

Cu,
Udontknow