Multitasking w Delphi

0

Witam

1.Mój program działa w ten sposób że gdy zacznie coś liczyć to nie mogę zminimalizować formy lub jej zamknąć. Druga rzecz to chciałbym aby podczas obliczeń była możliwość przełaczania np paneli i guzików obecnie jest to niemożliwe. Mogę kliknąc na dany element ale operacja zostanie wykonana dopiero po zakończeniu obliczeń.

2.Czy jest możliwość zatrzymania obliczeń, w pascalu była taka funkcja jak "halt" czy tu także działa.

Bardzo prosze o pomoc.

Pozdrawiam

0

Niedokładnie to trochę opisałeś. Ja rozumiem to tak: robisz obliczenia i program sie przymula. Jezeli robisz jakąs petle, to mozesz dac w niej:

Application.ProcessMessages;

Mozesz tez stworzyc nowy wątek.

[dopisane]
chesz zatrzymac obliczenia?
rzuc kodem to pewnie ktos zrozumie o co ci biega

0

Witam

Dzięki Chmolu teraz wszystko działa :)

A teraz kawałek kodu a dokładniej cała procedurka, jest to "serce" mojego programu.

Procedure TFiltr.filtracja;
var
k1 : TColor;
suma_g, G, suma_elementow : currency;
x, y, i, j : integer;
begin
Licznik2 := 0;
suma_elementow := 0;
x := Image5.Width ;
y := Image5.Picture.Height;

Progress.Max := x;
i:=0; j := 0;
for j := 0 to tabmax do
for i := 0 to tabmax do
begin
suma_elementow := suma_elementow + ftab [i,j];
end;

for x := tabmax to Image5.Width  + tabmin do   // macierz obrazu  szerokosc
for y := tabmax to Image5.Picture.Height + tabmin do  // macierz obrazu wysokosc
Begin
  Application.ProcessMessages;
 
  suma_g := 0;   // czyszczenie zmiennych

  // odczyt jednej tablicy filtru
  for j := tabmin to tabmax do
   begin;
  for i := tabmin to tabmax do
    begin

      k1 := Image5.Picture.Bitmap.Canvas.Pixels[x+j,y+i];  // macierz obrazu
      suma_g := suma_g + (GetGValue(k1)* ftab[i+tabmax,j+tabmax]);
      // koniec odczytu
    end;
   end;
    G := suma_g / suma_elementow;
    Image6.Picture.Bitmap.Canvas.Pixels[x, y] := RGB(Round(G), Round(G), Round(G));
    Progress.Position := x;

end;
Porownanie;

end;

Jeśli ktoś będzie miał jakiś pomysł na zatrzymanie tej petelki to będę wdzięczny.

Pozdrawaim

0

nie bardzo rozumiem czemu chcesz ja przerywac tzn czy z zewnatrz czy sama ma sie przerywac ?

najprosciej w kilku miejscach gdzie tam sobie zechcesz dodac

if zatrzymaj then break;

gdzie zatrzymaj to bedzie jakis bool deklarowany w odpowiednim miejscu i inicjalizowany jako false, no i wewnatrz petli dajesz ify i jak trzeba to sam kodujesz kiedy ma nastapic zatrzymanie albo dodajesz buttona ktory wpisuje zatrzymaj:=true oczywiscie trzeba uzyc Application.ProcessMessages zeby petla nie zamulila formy i zeby dalo sie kliknac ten button, mozesz tez dodac gdzies przechwytywanie klawisza nacisnietego i tam np na escape bedzie haltowal.

Jezeli z jakichs powodow nie chcesz dokladac ifow a halt ma oznaczac wyjscie z calej procedury to mozesz uzyc wygodnego goto, ktore coprawda bywa uwazane za nieeleganckie ale czesto jest naprawde najprostszym wyjsciem, lub jedynym na wyjscie z ramki begin-end.

0

Chyba najlepszym sposobem jest nowy wątek bo processmessages tylko spowalnia działanie pętli.

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