Wątki działają tylko na Windows7

0

Witam,
Postanowiłem do mojej aplikacji zastosować wątki, aby nie zawieszała się przy pobieraniu pliku z internetu. Wszystko ładnie pięknie, ale tylko na Windows 7. Na XP i Vista nie działa, tzn. program uruchamia się, ale wątek nie. Czym to może być spowodowane? Kompiluje w Delphi 2009 na Windows 7.

W type:

  TWatek = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation:

procedure TWatek.Execute;

begin
  FreeOnTerminate := true;

  if not terminated then
  begin
  Form1.pobieranieInformacji(self);
  terminate;

  end;

end;

oraz

procedure TForm1.StartWatku(Sender: TObject);
var Watek : TWatek;
begin
Watek := TWatek.Create(false);
end;

Nie wiem czy wszystko dobrze robię (mam nadzieje, że nie), bo dzisiaj dopiero nauczyłem się wykorzystywać wątki. Jeśli będzie Wam potrzebna procedura pobieranieInformacji to piszcie, ponieważ jest ona bardzo długa i nie chcę bez potrzeby jej tutaj wklejać.

0

wszystko to robisz, ale źle. Jak się za coś bierzesz to trzeba mieć elementarną wiedzę o tym. Najpierw poczytaj o wątkach i o odwoływaniu się z nich do VCLa i jak to działa

generalnie w execute powinno być to co masz w pobieranieInformacji + zapewne modyfikacje

0

Czyli przez to, że coś robie źle (nadal nie wiem co dokładnie, może mi powiesz?) to na jednym systemie program działa a na drugim nie?

0

napisałem Ci co robisz źle

0

a możesz mi podać przykład jak powinno się poprawnie odwoływać z wątku do VCLa?

0

nie rozumiesz, że to nic nie zmieni. MUSISZ TO CO ROBISZ W pobieranieInformacji PRZENIEŚĆ DO WĄTKU!

0

Zrobiłem to już (wprowadzając kilkadziesiąt koniecznych poprawek) i nadal działa tylko na Win7

Może podam kod głównego forma: http://www.wklejto.pl/40606

0

jeszcze dużo nauki przed tobą.
Ogólnie to w wątku masz operować na zmiennych wątku a nie na formie!

Co do szczegółów to nie mam siły tłumaczyć bo generalnie wszytko jest źle i trzeba to napisać od nowa aby działało

0

http://4programmers.net/Delphi/Artyku%C5%82y/W%C4%85tki

ja ostatnio po pierwszym podejsciu mi chodzilo na win XP.

0

oj misiek, ale smucisz. w wątku możesz operować na dowolnym obiekcie, ważne, żeby tylko rozumieć, co się robi. form.pobieranieInformacji() wywołane z poziomu wątku - gdzie ty tu problem widzisz? tak naprawdę wystarczy synchronizować dostęp do wizualnych elementów formatki (sam obiekt tylko opakowuje formatkę, ale nią nie jest, więc metody nie dotykające elementów wizualnych można jak najbardziej wywoływać bez synchronizowania) i innych współdzielonych między wątkami elementów (nie thread-safe), uważać na zakleszczenia i rozumieć, który wątek obsługuje kolejkę komunikatów.
za agresywny się zrobiłeś. ja rozumiem, że brak inwencji użytkowników tego forum i innnych czasami dościga tylko brak ich wiedzy, ale tak akurat nie jest w tym wypadku, więc się ogarnij!

0

a odpowiadając w temacie: co to za shit:

procedure TForm1.StartWatku(Sender: TObject);
var Watek : TWatek;
begin

if Watek.Terminated = false then
...

jak możesz sprawdzać Watek.Terminated = false kiedy Watek jest niezainicjowanym obiektem? nie wiem jakim cudem działa to pod jakimkolwiek systemem - ot, przypadek. poza tym naucz się obsługi debugera, życie stanie się prostsze. nawet popełniłem swojego czasu artykuł o tym, poszukaj go, przeczytaj, zrozum i naucz się na pamięć.

0

może się ŁF nie przyglądałeś temu kodowi, ale praktycznie 75% lini kodu w execute wątku wygląda tak

        if nazwamedalu = 'hard worker' then begin Form1.Label17.Caption := nazwaskilla; Form1.Image2.Visible :=true; Form1.Image10.Visible:= false; Form1.Label17.Visible := true; end;
         if nazwamedalu = 'congressman' then begin Form1.Label18.Caption := nazwaskilla; Form1.Image3.Visible :=true; Form1.Image11.Visible:= false; Form1.Label18.Visible := true; end;
         if nazwamedalu = 'president' then begin Form1.Label19.Caption := nazwaskilla; Form1.Image4.Visible :=true; Form1.Image12.Visible:= false; Form1.Label19.Visible := true; end;

a pozostałę 25% odwołuje się do TXMLDocument, który bez synchronizacji potrafi się dziwnie zachowywać więc jak to wszystko będziesz synchronizował to sobie możesz ten wątek do **** wsadzić.

Biorąc pierwszą wersję

procedure TWatek.Execute;

begin
  FreeOnTerminate := true;

  if not terminated then
  begin
  Form1.pobieranieInformacji(self);
  terminate;

  end;

end;

to należało by to zrobić tak (schematycznie bo to nie przejdzie)

procedure TWatek.Execute;

begin
  FreeOnTerminate := true;

  if not terminated then
  begin
  Synchronize(Form1.pobieranieInformacji(self));
  terminate;

  end;

end;

co jest idiotyzmem, bo równie dobrze można to zostawić po staremu bez wątku

0

Wczoraj siedziałem do późna z tym programem. Coś mnie tknęło i wywaliłem wątki. Okazało się, że program dalej nie działa na XP. Poprzyglądałem się i okazuje się, że funkcja pobierzPlik(); nie działa, tzn. nic nie zwraca (pusto). Przed dodaniem wątku trochę zmodyfikowałem program, ale nie sprawdzałem na bieżąco czy działa na innych systemach. Więc chyba mogę stwierdzić, że to nie jest wina wprowadzenia wątku. Myślę też (mogę się mylić), że wprowadzenie synchronizacji nic nie da, ponieważ podczas działania procedury pobierzInformacje (teraz już w execute), która jest w nowym wątku, nic innego się nie wykonuje. Tak jak w moim 1 poście: wątek wprowadziłem jedynie po to aby aplikacja nie zamrażała się przy pobieraniu pliku.

0

No to wrociles do punktu wyjscia. Czas wrzucić procedure czytającą na inną formę i sprawdzić ją z osobna. Na przyszlosc proponuje sprawdzac program krok po kroku bo czasami napisanie 300 linijek za jednym razem przynosi nastepne 300 minut straconego czasu na znalezienie w nich bledu. Z czasem bedziesz potrafil pisac dluzsze fragmenty bez koniecznosci sprawdzania czy interpreter sie wyklada co jedna nowo napisana linie.

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