Wątek (thread) w delphi

0

Witam serdecznie.

Jak to jest, że definiując wątek :
type
TAAA = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

procedure TAAA.Execute;
begin
{ Place thread code here }
repeat
application .processmessages;
//dla testów nic tu nie ma
until (False)or(self.terminated);
end;

potem klikając w guzik wywołujący kod:
var a : TAAA;
begin
a:=TAAA.Create(False);
a.FreeOnTerminate:=True;
end;

użycie procesora wzrasta z 1-2% do 50% i więcej czasami (nie wspomnę o uruchomieniu drugiego takiego wątku)

po 'zabiciu' wątku użycie procesora spada do normalnego poziomu.

pozdrawiam
ps. wojuje od rana z tą zagwozdką, google nic nie mów a mi już pomysłów brakuje.

0

a spróbuj napisać taką pętle

repeat
application .processmessages;
//dla testów nic tu nie ma
until (False)

bez użycia wątków, i zobacz jakie obciążenie będzie na procesorze.

0

application .processmessages;

wywal to.

0

hello ponownie

bez wątku wszystko jest OK - użycie na poziomie 5-10%

wywalając Appliaction.ProcessMessages i wstawiając np.
a:=5;

użycie procesora też oscyluje na poziomie 50%

czy któryś z szanownych grupowiczów mógłby taki prosty test wykonać u siebie?
jestem ciekaw gdyż na różnych maszynach i różnych Delphi problem wygląda identycznie.

pozdrawiam

0

U mnie (Delphi 7, Windows XP) dochodzi nawet do 66% (widocznie mam gorsze procka bo fakt mój komp już ma ponad 2 lata bez modernizacji) widocznie zawsze tak jest ze taka pętla "katuje" procesor. Zresztą to niby logiczne nawet bez osobnego wątku gdy to (taką pętle) napiszesz będzie podobny efekt.

Ale jak napiszesz tak:

procedure TAAA.Execute;
begin
  { Place thread code here }
  repeat
       //dla testów nic tu nie ma
     Sleep(100);
     application .processmessages;
  until (False)or(self.terminated);
end;

wszystko jest w porządku. Myślę że w praktyce (pisząc normalny kod, który faktycznie coś robi) raczej nie powinno dojść do nadmiernego obciążenia procesora. Zresztą napisałem trochę programów wykorzystujących wątki i nigdy nie miałem takiego problemu.

0

wystarczy najdrobniejszy sleep w pętli, czasami nawet sleep(0) daje radę (w takiej postaci informuje system, że wątek może zostać wywłaszczony i sterowanie leci do innych wątków).
jeśli jest tak jak zrobiłeś - pętla, a w pętli cokolwiek, co nie czeka nawet przez ułamek milisekundy (czy sleep, czy waitforsingleobject/waitformultipleobjects i pochodne), to wątek wykonuje się z całą dostępną mocą rdzenia. nie ma co się dziwić.

0

Witam ponownie

wstawiłem sleep(1) do pętli - obciążenie procesora spadło do 'normalnych' poziomów :-)

teraz mam następne pytanie, trochę już niezwiązane z tematem głównym:

  • w tej pętli wysyłam dane do urządzenia w sieci lokalnej przy pomocy pochodnych od TIdTCPConnection.

Zdecydowałem się na wykorzystanie wątku, gdyż dane modyfikowane muszą natychmiast pojawić się
po 'drugiej stronie' sieci.

wszystko działa OK (sprawa z wątkiem), ale [???] (inna sprawa)
polecenie SEND_DATA wykonuje się prawidłowo przez kilka - kilkanaście sekund i potem
wszystko się 'zawiesza' (w sensie transmisja)

odstępy czasowe pomiędzy wysyłką nie pomagają.

pozdrawiam

0

Pokaż kod, może tworzysz połączenie, a nie zwalniasz po nim pamięci przed tworzeniem nowego co skutkuje zawieszeniem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1