Kezdőoldal » Számítástechnika » Programozás » Delphi-ben elakadtam! Aki...

Delphi-ben elakadtam! Aki tud, kérem segítsen!?

Figyelt kérdés

Ü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!



#Delphi #TCP #clientsocket
2017. febr. 21. 23:11
 1/9 anonim ***** válasza:

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.

2017. febr. 21. 23:15
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:

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ő

2017. febr. 21. 23:22
 3/9 anonim ***** válasza:
Nincs.
2017. febr. 21. 23:59
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:

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..

2017. febr. 22. 00:10
 5/9 anonim ***** válasza:
Akkor a threadekkel is igazam volt. ;)
2017. febr. 22. 07:36
Hasznos számodra ez a válasz?
 6/9 anonim ***** válasza:

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.

2017. febr. 22. 09:37
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:
Neki ez a gányolás kell, nem érted?
2017. febr. 22. 10:43
Hasznos számodra ez a válasz?
 8/9 A kérdező kommentje:

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ő

2017. febr. 22. 19:47
 9/9 anonim ***** válasza:
Delphi programozási nyelv nem létezik.
2017. febr. 22. 22:06
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!