Klient wiesza się a serwer nie

0

Mam na fomie klienta i serwer TCP. Mam kod:

procedure TForm1.b1Click(Sender: TObject);
begin
if klient.connected then
begin
  if pracujjako.Text = 'Klient' then begin
  klient.SendCmd('1');
  if klient.LastCmdResult.TextCode = '200' then begin
    b1.Visible:=false;
    image1.Visible:=true;
  end;
  end else begin
  klient.SendCmd('1');
  if klient.LastCmdResult.TextCode = '200' then begin
    b1.Visible:=false;
    image2.Visible:=true;
  end;
  end;
end;
end;

Chodzi o to, że jeśli pracujjako.text = 'Klient' to po wykonaniu poleceń program wiesza się, natomiast jeśli wykonuje polecenia po else, to wszystko dobrze działa. Mam też na formie Tidantifreeze. Co zrobić żeby w obu przypadkach nie zawieszał się program??

0

Hallo maciejplonski!

Szczerze mowiac nie mam zbyt wielkiego doswiadczenia w programowaniu z TCP, ale mam nadzieje, ze moje ogolne uwagi dopomoga Ci w znalezieniu bledu:

  1. Jasno i prosto napisany kod upraszcza jego analize. Dlatego tez chce Ci zwrocic uwage, ze Twoj cod mozna napisac prosciej poniewaz:
  • „klient.SendCmd(1)“ bedzie zawsze wykonane. Niezaleznie od tego czy „pracujjako.Text = Klient
  • warunek „if klient.LastCmdResult.TextCode = 200“ bedzie zawsze badany. Niezaleznie od tego czy „pracujjako.Text = Klient
  1. Proponowalbym Ci wiecej czasu poswiecic na dokladnie zaznaczac poczatki i konce blokow („begin ... end“) stosujac wciecia.

Pozwolilem sobie zastosowac obie te uwagi do Twojego kodu. I oto co z tego wyszlo:

procedure TForm1.b1Click(Sender: TObject);
begin
  if klient.connected then
  begin
    klient.SendCmd('1');
      
    if klient.LastCmdResult.TextCode = '200' 
    then b1.Visible := false; 
        
    if pracujjako.Text = 'Klient' 
    then image1.Visible := true
    else image2.Visible := true;   
  end;
end;

Mysle, ze analiza zapisanego w ten sposob kodu jest odrobine latwiejsza. Jak z niego wynika:

  1. Procedura bedzie wykonywana tylko wtedy kiedy “klient.connected” (true).
  2. Jedyna roznica w wykonaniu prcedury w zaleznosci od tego co zawiera „pracujjako.Text“ jest to, jaki „image“ zostanie uaktywniony.

Teraz mozesz zadac sobie pytanie, czy rzeczywiscie dokladnie takiego przebiegu procedury oczekiwales.

Na podstawie kodu procedury nie potrafie wskazac linii w ktorej program sie zawiesza (jezeli w ogole dzieje sie to w tej procedurze). Najlepiej zdefiniowac “break point” na poczatku procedury i wystartowac program w trybie “debug”. Wtedy bedziesz mogl z cala pewnoscia wskazac procedure i linie kodu, w ktorej wystepuje problem.

Pozdrawiam
Markus

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