TThread zawierajacy Sleep nie dziala poprawnie w Lazarusie

0

Witam,
mam problem z lazarusem. Zrobilem sobie prostą klase wątku wg instrukcji:
http://wiki.freepascal.org/Multithreaded_Application_Tutorial/pl#Czy_potrzebujesz_wielow.C4.85tkowo.C5.9Bci.3F,

w procedurze którą urchamiam poprzez Synchronize zawarłem Sleep(100); coś w ten deseń:

procedure TMyThread.ShowProgress;
var
  I: Integer;
begin
  for I := 1 to 100 do  // to moze byc odliczanie - cokolwiek z 1/10 sekundy przerwy
  begin
    Sleep(100);
  end;
end;

procedure TMyThread.Execute;
begin
    Synchronize(@ShowProgress);
end;

Po uruchomieniu nowego wątku pętla ze sleepem się wykonuje, jednak nie mogę przesunąć aplikacji chwytając za pasek górny - jednym słowem wątek działa jakby go nie było - gdybym wkleił tą pętlę pod zwykły button (bez wątku) efekt będzie taki sam...
kto pomoże?

0

Synchronizuj tylko to co zmienia jakikolwiek wygład formatki.
Synchronize() - każe wykonać metodę w ramach głównego wątku.

0

sprobuj cos takiego

procedure TMyThread.ShowProgress;
var
  I: Integer;
begin
  for I := 1 to 100 do  // to moze byc odliczanie - cokolwiek z 1/10 sekundy przerwy
  begin
     Synchronize( //albo zamiast Synchronize daj Queue wtedy nie bedzie ci blokowac glownego watku
procedure
begin
...
end);
    Sleep(100);
  end;
end;
 
procedure TMyThread.Execute;
begin
    ShowProgress;
end;
0

ok zrezygnowałem z **Synchronize **(wiem co ono robi), jednak moja metoda ShowProgress, zmienia pozycję progressbara na formatce..

Zatem jest to jakieś odwołanie do GUI.

Wygląda na to, że bez **Synchronize **odświeżenie **progressbara **działa bezproblemu... chociaż jest to naciągane wg mnie.

2

To zrób procedurę ProgressStep zmieniającą pozycje ProgressBara i wywołuj ją z Synchronize, tylko na czas zmiany pozycji.

0

DobraPanowie dzięki za rady, faktycznie zamiast wsadzać całą pętlę w synchronize, synchonizuję tylko samą zmianę progressbara i działa :)

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