wątek nie działa jak powinien

0

Mam coś takiego

rocedure TStoper.Execute;
var adres:string;
begin
  FreeOnTerminate := True;
  while not (Application.Terminated) or (Terminated) do
  begin


adres:=form1.listbox2.Items[0];
if URLDownloadToFile(nil, Pchar(adres), 'strony\0.htm', 0, nil) <> 0 then
ShowMessage('Błąd podczas ściągania pliku');

  end;
end;

i powinien w tle sobie ściągać, ale na czas ściągania pliku zamula program na maksa jak bym robił to bez wątku.

Mam jeszcze jedno pytanko w związku z tym. Gdyby już robił mi tak ładnie to w tle i przed end; dodał

szukaj(s);

czy ta procedurę która by sobie gdzies tam była też by wykonał w ramach tego wątku czy nie??

0

Robilem cos podobnego, z tym ze watek <ort>zamknolem </ort>w dll'u, na czas sciagania aplikacja totalnie zamulala, <ort>wkoncu </ort>sie zdecydowalem na cos innego, to co bylo w Execute przeksztalcilem w procedure a nestepnie ja odpalem za pomoca BeginThread i problem zamulania przeszedl do historii. Jesli chodzi o paremtry procedury to trzeba sie zadolic w takiej metodzie tylko przekazywaniem Pointera.

0

Robilem cos podobnego, z tym ze watek zamknolem w dll'u, na czas sciagania aplikacja totalnie zamulala, wkoncu sie zdecydowalem na cos innego, to co bylo w Execute przeksztalcilem w procedure a nestepnie ja odpalem za pomoca BeginThread i problem zamulania przeszedl do historii. Jesli chodzi o paremtry procedury to trzeba sie zadolic w takiej metodzie tylko przekazywaniem Pointera.

Mozesz dokładniej na przykładzie

0

Piszesz procedure ktora nie przynalezy do zadnej z klas np.

Procedure Start(Val: Pointer);
Begin
 // Tresc tak jakbys pisal procedure w watku Execute
End;

Var
 C : Cardinal; // Przydaje sie to chociazby zeby wrazie czego zkilowac watek

Proceure TMainForm.Button1.OnClick(Sender: TObject);
Begin // Odpalnie procedury jaka watek
 BeginThread(Nil, 0, Addr(Start), Nil <- Tu pointer do parmetru/-u ow, 0, C);
End;
 

Pisze z glowy wiec prosze o wyrozumialosc.

Konkretny przyklad wyslalem Tobie na maila.

0

Pisze z glowy wiec prosze o wyrozumialosc.

Konkretny przyklad wyslalem Tobie na maila.

Co do maila jak wysłałeś samo źródełko to zajmowało pewnie mało więc zapewne się skasowało. Ostatnio robaczki internetowe zwiększyły aktywnośc więc kasuje automatycznie listy z załącznikami mniejszymi niż 150kB. Jeśli możesz to naneluto@op.pl z tego konta nie kasuje

0

Wyslane, jakby byly jakies problemy zchecia odpowiem ale juz nie dzis na nocke musze sie ewakulowac :-/

0

Wyslane, jakby byly jakies problemy zchecia odpowiem ale juz nie dzis na nocke musze sie ewakulowac :-/

Wielkie dzięki chyba sobie poradzę z tym. Wracając jeszcze do procedury wyżej. Jak zatrzymać wątek tak wszystko świetnie działa, tylko wywala błąd przy zatrzymaniu wątka.
procedure Start(Val: Pointer);
begin
// Tresc tak jakbys pisal procedure w watku Execute
end;

var
C : Cardinal; // Przydaje sie to chociazby zeby wrazie czego zkilowac watek

Proceure TMainForm.Button1.OnClick(Sender: TObject);
begin // Odpalnie procedury jaka watek
BeginThread(nil, 0, Addr(Start), nil <- Tu pointer do parmetru/-u ow, 0, C);
end;

0

Ja bym zrobil tak poniewaz z kilowaniem watkow roznie bywa, wstawil bym zmienna powiedzmy globalni np typu Boolean i w samej proceduze odpalanej jako watek co jakis kawalek kodu (w petlach itd) sprawdzal bym czy jest wartosc True na danej zmiennej jesli tak to Exit i na browca. ;-)

W tym przykladzie (wsumie to nie przyklad) ktory wyslalem Ci na maila,
w glownym rekordzie (TStatusRect) jest takie cosik jak Abort i to pelni role wlasnie takiej zmiennej ktora jesli jest ustwiona to watek konczy prace. Z tym ze trzeba sie liczyc z pewnym <ort>opuznienim </ort>zakonczenia wszystkich watkow.

0

Ja też miałem problem z zamulaniem systemu przez wątek, ale poradziłem sobie z tym w inny sposób. Po prostu strtuję go i stopuję wtedy kiedy mi jest potrzebny. Ponieważ wykonuje się błyskawicznie, to zamulenia systemu praktycznie nie ma.

  1. tworze wątek mniej więcej taki

{ TMojWatek }
constructor TMojWatek.Create;
begin
inherited Create(typ);
...... // tworze zmienne
end;

destructor TMojWatek.Destroy;
begin
..... // zwalniam zmienne
inherited;
end;

procedure TMojWatek.Execute;
begin
FreeOnTerminate:=False; //nie koncz watku przy końcu procedury
while not (Terminated) do begin
try
//blablabla
Synchronize(COS); //czasem cos trzeba synchronizować
//blablabla
finally
if not Terminated then Suspend;
//Suspend TYLKO ZATRZYMUJE wątek po jego wykonaniu
end;
end;
end;

  1. teraz w głównym formularzu tworzę wątek

    MojWatek:=TMojWatek.Create(true);
    //jest true czyli wątek nieuruchomiony
    MojWatek.Resume; //uruchamiam go pierwszy raz

  2. Kończenie wątku
    MojWatek.Terminate;
    MojWatek.Destroy; //zakonczenie watku

  3. ponieważ ja uzywam synchronizacji wątków to czasem potrzebuję sprawdzenia czy wątek jest uruchomiony czy nie
    if MojWatek.Suspended then MojWatek.Resume;
    //czyli jeśli wątek zatrzymany to go uruchom

U mnie działa bez zarzutu

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