Wątki...

0

Witam...
Mam tak zadeklarowaną klasę w Unit Watki:

type
  TWatek = class(TThread)
  protected
    procedure Execute; override;
  end;

implementation
uses Wyszukiwanie, MainForm;

procedure TWatek.Execute;
var
  Wysz: TWyszukiwanie;
begin
  FreeOnTerminate:=true;
  Wysz:=TWyszukiwanie.Create(MainForm.Tekst, MainForm.InBool, MainForm.AllBool);
  Wysz.Wyszukaj;
  Wysz.Free;
end;

W formie głównej mam tak:

 
Uses Watki;

var 
  Watek: TWatek;

procedure TForm1.WyszukajClick(Sender: TObject);
begin
  Watek.Resume;
end;

procedure TForm1.WstrzymajClick(Sender: TObject);
begin
  Watek.Suspend;
end;

procedure TForm1.EditSearchChange(Sender: TObject);
begin
  if not Watek.Suspended then begin    //Tu już nie wiem jak napisać
    Watek.Terminate;			  //Kombinowałem na różne sposoby
    Watek.Free;				
    Watek:=TWatek.Create(True);
  end;
end;
end; 

initialization
  Watek:=TWatek.Create(True);

W procedurze EditSearchChange chciałbym, aby po zmianie tekstu, wątek był tworzony jeszcze raz i przy wywołaniu Watek.Resume wykonywała się procedura Execute od początku.
Inny problem pojawia się gdy w trakcie działania wątku lub po jego wstrzymaniu zamykam formę. Jeżeli w sekcji finalization nie ma linii Watek.Free to wyskakuje mi błąd Access Volation, jeżeli jest to błąd "Nieprawidłowe dojście okna".

Pzdr

0
uses Watki;

var 
 Watek: TWatek;

procedure TForm1.WyszukajClick(Sender: TObject);
begin
 //Watek.Resume;
//zamiast tego dałbym:
if not watek.suspended then
   watek := TWatek.Create(false);
else
   watek.Resume;
end;

procedure TForm1.WstrzymajClick(Sender: TObject);
begin
 Watek.Suspend;
end;

procedure TForm1.EditSearchChange(Sender: TObject);
begin
 if not Watek.Suspended then begin  //jeśli nie zatrzymany
      Watek.Terminate;             //może tak
         
  //Watek:=TWatek.Create(true); 
 //z tego bym zrezygnowal
 end;
end;
end; 

 //z tego tez bym raczej zrezygnował
{initialization
 Watek:=TWatek.Create(True);}

a co do tego złego dojścia do okna, to z doświadczenia wiem, że chodzi o to, że w atku odwołujesz się (przypisujesz) komponentom z formy jakieś wartości - nalezy użyć metody Synchronize(). proponuje zatem:

Synchronize(wysz.wyszukaj);
0

Nie korzystam już z EditSearchChange...
!! !! Poprzez synchronize mam zwieszoną aplikację, a możliwość wykonywania innych operacji jest dla mnie najistotniejsza.
Nic się już nie wysypuje bo nie mam możliwości sprawdzenia tego.
Nie mogę zamknąć programu ani wstrzymać wątku dopóki się nie zakończy.

0

Skorzystałem z porad Ludomira i taka jest koncepcja.
Przedstawię o co mi chodzi, może ktoś zrozumie mój pokręcony zamiar... ??

Mam jednego Button-a i przy jego pomocy chcę odpalić wątek, następnie go wstrzymać i może znów odpalić jak tam użytkownik będzie chciał. Jednak gdy po wstrzymaniu wątku zmienię tekst w Edit to wątek powinien odpalić się od nowa.
Kiedy wątek jest uruchomiony to Edit jest zablokowany, przy wstrzymaniu można zminić tekst w Edit.

procedure TForm1.ButtonClick(Sender: TObject);
var text: String;
begin
  if Edit1.Text<>'' then begin
    if Button.Caption='Wyszukaj' then begin
      Edit1.Enabled:=false;
      if Text<>Edit1.Text then Watek:=TWatek.Create(Edit1.Text)
      else Watek.Resume;
      Button.Caption:='Zatrzymaj';
      Text:=Edit1.Text;
    end else begin
      Watek.Suspend;
      Edit1.Enabled:=true;
      Button.Caption:='Wyszukaj';
    end;
  end else StatusBar.Panels.Items[0].Text:='Wpisz szukane słowa...';
end;

Niestety to nie działa tak jakbym chciał...

Pzdr

0

Mozesz to zrobic pod warunkiem ze w watku masz wrzucone Application.ProcessMessages i warunek jesli zmienna ma pozytywna wartosc to kontynuuj. Drugim przyciskiem przypisujesz wartosc negatywna. Wiec jesli uzytkownik kliknie drugi przycisk watek zostanie przerwany.

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