Delphi-ben elakadtam! Aki tud, kérem segítsen!?
Üdv.
Egy olyan progit írok, ami egy hálózaton lévő Relé Kapcsoló-t vezérel TCP kapcsolaton keresztül.
A kódom nyilván nem profi, de legalább működik, egyetlen sort kivéve(***-al jelöltem a kódban):
procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
a : String;
b : String;
begin
for i := 1 to 1 do
a := paramstr(i);
ClientSocket1.Address := (a);
ClientSocket1.Port := 6622;
ClientSocket1.Active := true;
*** ShowMessage(a);
for i := 2 to 2 do
b := paramstr(i);
if (ClientSocket1.Socket.Connected = true) then
begin
ClientSocket1.Socket.SendText(b);
end
else
begin
ShowMessage('nemjo');
end
end;
Ha a megjelölt sort (***) kiveszem (nincsen rá szükség), akkor a ClientSocket1.Socket.SendText(b); sorom nem fut le, és a 'nemjo' üzenetet kapom!
Kezdő' programozóként ez számomra teljesen értelmetlen!
Esetleg valakinek nem az?
Mert mit is csinál a sor amit kivennék? Egyszerűen visszaadja a B változó tartalmát egy új ablakban, amire rá kell kattintani, hogy eltűnjön, ezután lefut a *** sorom ami a lényeg lenne! Ha nem kattintok rá, akkor nem fut le a sor (***), amit szeretnék!
Kérlek ne túl szakmaian fogalmazzatok, mert 3 napja kezdtem a Delphi nyelvet, eddig jutottam a google segítségével, de a problémámra nem találtam magyarázatot, ezért vagyok most itt.
Értelmes válaszokat előre is nagyon köszönök!
Mi a búbánat azok az 1 lépésű for ciklusok??
Gondolom valami threading problémád van, és a ShowMessage lassít annyit a kódodon, hogy jó sorrendben fussanak le a különböző threadek.
Mindenesetre nem gondolnám, hogy 3 nap programozás után TCP-n kéne reléket vezérelni.
Nézd... most erre van szükségem és nincsen időm bemagolni a Delphi nagykönyvet (sajnos).
Esetleg van valami javaslatod is, hogy hogyan folytassam, esetleg mit változtassak?
Kérdező
Problémám megoldódott, hála magamnak. Csak a ClientSocket ClientType-ját kellett NonBlocking-ról Blocking-ra átírni. Ennyi!
A for ciklusokat meg kivettem, ezért jár egy köszönet, nem is értem, minek raktam bele..
Pont ezt akartam mondani, hogy a kapcsolat típusát nézd meg. Gondolom nem nagyon értesz a hálózatokhoz, ezért adok egy kis háttérinfót:
A TCP kapcsolat felépítéséhez egy 3 lépéses "handshake" kell. Először a kezdeményező küld egy SYN csomagot, arra kap egy SYN/ACK csomagot, majd válaszként küld egy ACK csomagot, ezzel jön létre a kapcsolat. Ehhez némi idő kell. Amikor a ClientSocket1.Active := true; sorral ezt elindítod, akkor megy az első csomag ki. De ha nem állítod blocking-ra a kapcsolatot, akkor ő a háttérben egy új szálon fog kapcsolódni, a kódod pedig megy tovább. Azért nem működött a kód a ShowMessage nélkül, mert mire az if (ClientSocket1.Socket.Connected = true) sorhoz ért, még nem épült ki a kapcsolat. A messagebox pedig megakasztotta a folyamatot annyira, hogy kiépüljön.
Lehet ezt így csinálni, csak nem érdemes. Ugyanis így, ha bármilyen lassulás, kapcsolódási hiba van, akkor az meg fogja akasztani a kódodat és nem fog válaszolni a programod. Ezt úgy kell helyesen csinálni, hogy a ClientSocket OnConnected eseményére írsz egy metódust és abban küldöd el az adatokat, mert az már csak akkor indul el, mikor konkrétan kiépült a kapcsolat és így nem kell blocking módot használnod.
Azért javaslom, hogy kicsit próbálkozz az objektum orientált programozás alapjait megismerni, mert egyből a hálózat kezeléssel indítani nem épp szerencsés, ha a mögöttes paradigmák kimaradnak, nem tudsz hatékony kódot írni.
Köszönet a #6-ik válaszolónak! Bár a progim már megfelelően működik, átírom az OnConnected részre amit kell meg visszaváltok NonBlocking módra. Érdekel a Delphi nyelv, szóval mindenképpen átolvasok néhány publikációt. Hirtelen kellett ez a cucc most, azért gány az egész és ugrottam egyenesen a mély vízbe.
Köszönöm még egyszer emberek!
Kérdező
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!