Watek, Indy, przycinka formy;

0

Witam, jak probuje polaczyc komponent ClientIndy To mi niezle przycina forme. Postanowilem wiec uruchamiac go w watku, ale i to rozwiazanie mi nie pomaga (mozliwe, ze mam cos zle ... dopiero startuje z watkami ) takze jesli ktos moze to niech rzuci okiem na kodzik i napisze mi dlaczego ta forma nadal sie tnie, pozdrawiam i z gory dzieki za posty

type
  TPolaczenie = class(TThread)
  private
    procedure Polacz;
  protected
    procedure Execute; override;
  end;

procedure TPolaczenie.Polacz;
begin
 if not form1.Client.Connected then
   begin
    Application.CreateForm(TFStatus, FStatus);
    FStatus.Show;
    application.ProcessMessages;
    FreeOnTerminate := True;
    form1.Client.Host := IP;
    form1.Client.Port := PORT;
    form1.Client.Connect(6000);
    KlientPrzyjmuje := TKlientPrzyjmuje.Create(true);
    KlientPrzyjmuje.FreeOnTerminate := true;
    KlientPrzyjmuje.Resume;
   end;
end;

procedure TPolaczenie.Execute;
begin
  synchronize(Polacz);
end;
0

Specyficzne rozwiązanie wątku własciwie po co on tam? Używasz go jak procedurę, nie wiadomo co to za wątek KlientPrzyjmnuje, do tego mnóstwo rzeczy naraz rozbisz i sporo creatów, do tego nie widzę użycia watku a to ważne.
Mam przeczucie że problem leży w KlientPrzyjmuje - otóż czas łączenai nie jest zerowy, po wydaniu komendy connect najczęściej komponenty asynchronicznie się łączą (w standardowych nawet do5-7 sekund mi się zdarzało), co oznacza że jeśli masz wątek/procedurę w głównym wątku programu (obsłudze) a KlientPrzymuje czeka na nawiązanei połączenia - to czas zwisu apliakcji to wlasnie czas na nawiązanei połaczenia. Ale to tylko wróżenie z fusów bo jestem ciekawy jak ty używasz ten wątek.

0

nie no, robisz synchronize na polacz nie wiadomo po co - synchronize jest jak chcesz się odwołać do komponentu do którego dostęp ma kilka wątków - odwołujesz się do komponentu Indy który jest w klasie formy 1 chociaż powinien być w klasie wątku i w wątku tworzone no ale mimo to w form1 już się pewnie do tego komponentu nie odwołujesz więc synchronize nie jest potrzebne a synchronize przycina wszystkie wątki aż do dokończenia tej procedury - więc bez sensu

poza tym wątek chyba w ogóle nie jest ci potrzebny - wystarczy na formę wrzucić IdAntiFreeze z Indy Misc

0
Adamo napisał(a)

poza tym wątek chyba w ogóle nie jest ci potrzebny - wystarczy na formę wrzucić IdAntiFreeze z Indy Misc

A może TIdThreadComponent

procedure TForm1.btnConnect1Click(Sender: TObject);
begin
  IdThreadComponent1.Start;
end;

procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
begin
  //Kod, który ma być w wątku
end;

procedure TForm1.IdThreadComponent1AfterRun(Sender: TIdThreadComponent);
begin
  IdThreadComponent1.Stop;
end;
0

IdAntiFreeze ? :)

0

Jak zwykle problemem okazal sie brak mojej wiedzy, dzieki za posty i pozdrawiam

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