progressbar w pętli - zawieszony

0

Witam.
Piszę dosyć obszerny program do obliczeń pewnego technicznego zagadnienia. Chciałem dodać progressbar i zrezygnowac z wyświetlania w memo liczb od 1 do 400. Niestety progressbar "odświeża" się dopiero po wyjściu z petli. Tak właściwie to cały program jest "martwy", nawet okienka programu nie można przesunąć. Czy trzeba gdzieś włączyć odświeżanie obrazu? Memo cały czas wyświetla nowe informacje. Nie wiem co jest źle? Oto fragment kodu:

  for z:=1 to 400 do
   begin
   poprzeczny_moment_bezwladnosci[z]:=0;
   liczba_pelnych_prostopadloscianow_w_warstwie[z]:=0;
   srodek_powierzchni_y[z]:=0;
   srodek_powierzchni_x[z]:=0;
   for x:=1 to 400 do
      for y:=1 to 400 do
         begin
prostopadloscian:=przestrzen[x,y,z];
 liczba_przecietych_bokow:=0;   
.....
....
.....

srodek_powierzchni_y[z]:= srodek_powierzchni_y[z]/liczba_pelnych_prostopadloscianow_w_warstwie[z];
    srodek_powierzchni_x[z]:= srodek_powierzchni_x[z]/liczba_pelnych_prostopadloscianow_w_warstwie[z];

    poprzeczny_moment_bezwladnosci[z]:=poprzeczny_moment_bezwladnosci[z]-(liczba_pelnych_prostopadloscianow_w_warstwie[z]*((maxx-minx)/400)*((maxy-miny)/400))*srodek_powierzchni_y[z]*srodek_powierzchni_y[z];
    memo1.lines.Append('z= '+ FloatToStrF(z, ffFixed, 7, 2));
    progressbar1.Position:=(z div 400)*100;
   end;                                       
0

Zasadniczo problem z wyświetlaniem powinno załatwić

Application.ProcessMessages

dodanie tej linijki kodu za zmianą wartości ProgressBara.
Program jednak będzie "lagował" dlatego polecam osobny wątek do tych obliczeń.

0

W takim razie jak tworzy się takie osobne wątki? Bo rozumiem, że chodzi o to aby obliczenia były wykonywane pomimo, iż z programem będziemy robić co innego, tak?

0

Wątek główny obsługuje GUI, wątki poboczne zajmują się wszelkimi działaniami. Wtedy GUI się nie wiesza i jest na bieżąco odświeżane.

0

Niestety dodanie

Application.ProcessMessages ; 

nic nie zmienia

0

a gdzie dodajesz? spróbuj tak:

  for z:=1 to 400 do
   begin
   ...
   for x:=1 to 400 do
   begin
      Application.ProcessMessages;
      for y:=1 to 400 do
      ...
0

Dodawałem zaraz za zmianą wartości dla progressbara.
Niestety druga propozycja też nie działa. Progressbar "rośnie" dopiero kiedy program wykona tą pętlę. Jest to zasadnicza pętla dla działania programu i trochę trwa jej wykonanie. Dlatego chciałem mieć jakiś wskaźnik postępu prac obliczeniowych.

0

To dlaczego uparcie nie chcesz skorzystać z wątków? A uprzedzając pewnie kolejne pytanie o link: http://4programmers.net/Delphi/Artykuły/Wątki ;/

0

Ja używam TGauge i właściwości Progress. Działa zawsze.

0

Juhas: ale po co powtarzasz swoje posty. Jeśli padnie Tobie połaczenie czy jakiś będzie błąd przy wysyłaniu to sprawdź zawsze czy przypadkiem Twoja odpowiedź nie zdążyła się dodać w danym wątku.

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