Autor Téma: Zaměna volaných objektů TTCPBlockSocket a TBlockSerial  (Přečteno 464 krát)

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 395
  • Karma: 9
    • Verze Delphi: XE2
V rámci jedoho objektu  typu Thread volám v metodě "Execute" bud smyčku v připojení na seriový port nebo LAN

Jde mi o to jaký nejlepší postup zvolit  aby   mohl volat společný kod

KlientTCP: TTCPBlockSocket;
KlientRS232: TBlockSerial;
Kód: Delphi [Vybrat]
  1.      while    (KlientTCP.WaitingData>0)   do
  2. // Nebo
  3.      while    (KlientRS232.WaitingData>0)   do
  4. begin
  5. // spolecny kod pro LAN  i COM
  6. end  
  7.  

Samozřejmě mohu zvolit řešení ve stylu
Kód: Delphi [Vybrat]
  1.  if JeComPripojeni then  
  2. begin
  3.  while    (KlientRS232.WaitingData>0)   do
  4. begin
  5. // spolecny kod pro LAN  i COM
  6. end ;  
  7. end  
  8. Else
  9.  while    (KlientTCP.WaitingData>0)   do
  10. begin
  11. // spolecny kod pro LAN  i COM
  12. end ;  

a spolecny kod pri zmene kopirovat  ...

V každém případě bych preferoval efektivnější kód z hlediska rychlosti 

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 395
  • Karma: 9
    • Verze Delphi: XE2
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #1 kdy: 19-03-2021, 22:55:05 »
Tak už jsem jako Stano - odpovím si po hodine sám  ;)

Kód: Delphi [Vybrat]
  1.   case GSMDataInfo.DruhPripojeni of
  2.             // RS232 pripojeni
  3.             ConTypeRS232:
  4.               begin
  5.  
  6.                 while (PracovniMod = GmNormal) and (KlientRS232.WaitingData > 3) do
  7.  
  8.                 begin
  9.                   NactenaData := CteniDatFromModem;
  10.                   if KlientRS232.lastError <> 0 then
  11.                     break;
  12.                   SpolecnyKod(NactenaData);
  13.                 end;
  14.  
  15.               end;
  16.  
  17.             // - LAN TCP pripojeni
  18.  
  19.             ConTypeTCP:
  20.               begin
  21.                 while (PracovniMod = GmNormal) and (KlientTCP.WaitingData > 3) do
  22.  
  23.                 begin
  24.  
  25.                   NactenaData := CteniDatFromModem;
  26.                   if KlientTCP.lastError <> 0 then
  27.                     break;
  28.                   SpolecnyKod(NactenaData);
  29.                 end;
  30.               end;
  31.           end;
  32.  
  33.  
  34.           sleep(25);
  35.                  end;

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3180
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #2 kdy: 20-03-2021, 07:22:52 »
while (PracovniMod = GmNormal) and (KlientRS232.WaitingData > 3) do
Prompt je "> " (2 znaky), takze kdyz se nestastne trefis, muze ti to zustat na podmince Waiting Data > 3 viset, ne?

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 395
  • Karma: 9
    • Verze Delphi: XE2
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #3 kdy: 20-03-2021, 09:38:47 »
while (PracovniMod = GmNormal) and (KlientRS232.WaitingData > 3) do
Prompt je "> " (2 znaky), takze kdyz se nestastne trefis, muze ti to zustat na podmince Waiting Data > 3 viset, ne?
Technicky maš samozřejmě pravdu a ani jsem si tuto závislost neuvědomil
ale zatím mám to mám pojaté tak že  když PracovniMod = GmNormal jedna se o cyklus normální naslouchání načítání na portu/socketu
 a když začnu odesílat SMS nastavím PracovniMod := GmSendSMS a zpracování přijatých dat provádím jinde ..

Ale navedl si mě ke ke dvou otázkám
1. Jaká hodnota je u *.WaitingData  efektivní  - nebo to není potřeba řešit  a nastavit 0  anebo úplně použít jiný rozhodovací element.
2.  Jakou hodnotu Sleep() použít mezi požadavky na spuštění while smyčky    zatím mám 25ms  - ale netuším jestli to na modem není zbytečně rychlé a nestačilo by například 100ms   
 


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3180
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #4 kdy: 20-03-2021, 13:39:56 »
1. Jaká hodnota je u *.WaitingData  efektivní  - nebo to není potřeba řešit  a nastavit 0  anebo úplně použít jiný rozhodovací element.
2.  Jakou hodnotu Sleep() použít mezi požadavky na spuštění while smyčky    zatím mám 25ms  - ale netuším jestli to na modem není zbytečně rychlé a nestačilo by například 100ms
Pri hodnote > 1 budes muset resit timeout, aby ti to nezustalo viset. Jestli si to pamatuju, tak kdyz modem operoval s GSM siti, tak operace trvaly sekundy, takze 100 ms by melo bohate stacit, pokud nebudes vycitavat nejake telefonni seznamy nebo jina streva modemu.

IMHO nemusis data aktivne pollovat (teda pokud to nepotrebujes k nejakemu prepinani rezimu nebio k cemu, pak bych asi pouzil CanRead, ktery testuje> 0), ale stacila by nejaka metoda s timeoutem napr. ReadBufferStr, ktera bude cekat prostredky OS, takze nebude stroj zbytecne zatezovat. Jak dlouhy timeout zalezi na DTE rychlosti.
« Poslední změna: 20-03-2021, 13:42:18 od pf1957 »

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #5 kdy: 20-03-2021, 16:21:53 »
Kdybyste věděli, kolikrát jsem si za ty roky říkal, že jsem tomu měl udělat společného předka...

Jinak kdekoliv vidím, že se takhle testuje waitingdata, tak to pokaždé značí, že tu Synapsi voláš neefektivně a vlastně. Tu logiku kolem waitingdata, canread a spol. mají ty vysokoúrovňové čtecí funkce (tedy ty s timeoutem v parametru) zabudované v sobě. Ty si řekneš, jestli chceš číst dokud "něco" nepřijde, nebo že chceš číst nějaké konkrétní množství dat, a řekneš si, jak dlouho jsi ochotný na to počkat. Poskládáním těchto dvou principu pokryješ téměř všechny komunikační protokoly, se kterými jsem se kdy setkal.

Waitingdata, canread a recvbuffer (ta jediná bez timeoutu) jsou nízkoúrovňové funkce, kdyby si někdo chtěl implementovat nějaké vlastní čtení, například. Já to vy svých programech vlastně nikde nemíchám...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3180
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #6 kdy: 20-03-2021, 20:06:37 »
Poor
Rated 1 time
Kdybyste věděli, kolikrát jsem si za ty roky říkal, že jsem tomu měl udělat společného předka...
a nebo definovat a implementovat spolecny interface...

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 395
  • Karma: 9
    • Verze Delphi: XE2
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #7 kdy: 20-03-2021, 20:13:58 »
Kdybyste věděli, kolikrát jsem si za ty roky říkal, že jsem tomu měl udělat společného předka...
a nebo definovat a implementovat spolecny interface...

A nebo udělat  úplně novou knihovnu - to hezké tam nechat a přidat to nové potřebné  ;)
Myslím, že by to bylo života schopné i komerčně ..

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 403
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zaměna volaných objektů TTCPBlockSocket a TBlockSerial
« Odpověď #8 kdy: 22-03-2021, 10:34:14 »
Synapse je vyborna knihovna, kterou jsem pouzil nescetnekrate, at jiz pro ip ci pro serial. Za to patri gebymu obri dik, specialne, kdyz ji poskytuje zdarma.
Je fakt, ze drobny refactoring by ji asi prospel, idealne i s pripominkami jejich uzivatelu. (Pred lety jsme tam cosi resili s bufferem u tusim seriaku, kdyz data mohly byt napul v bufferu, napul ne a de facto... Co si pamatuju postavili jsme tomu vlastni buffer (a vlakna a i nejakou tu logiku stylu error handling, autoreconnect apod.)

Celkove vsak - diky Geby !
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux