Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - thread-problem


moloch - Fr 16.07.04 09:40
Titel: thread-problem
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 user profile iconUdontknow: Delphi-Tags eingefügt, Thread verschoben.


Udontknow - 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 - 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.


Udontknow - 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


maxk - 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.


Udontknow - 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 - 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:


Udontknow - 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:


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