<div dir="ltr">Jak rikam - Lazarusi detaily neznam, ale sockety podporuji non-blocking operace snad 'odjakziva' - a presne tak se to taky v servrech resi.<div>Pravda - v dnesni dobe uz je to lepe zabaleno, takze v .NET pred 4.0 to byly pary metod BeginNeco/EndNeco, od 4.0 jeste jednoduzsi pouziti pomoci NecoAsync</div><div>Verim tomu, ze Lazarus bude mit taky podporu</div><div><br></div><div>PS: rozumim tomu spravne, ze vam tam komunikuje 120+ PLC?</div><div>BR,</div><div>Marek</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Dec 10, 2020 at 11:25 AM Martin Záruba <<a href="mailto:swz@volny.cz">swz@volny.cz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">No já to vlastně takto předělal z verze, kdy bylo jedno vlákno. Ono to v <br>
podstatě funguje tak, že se připojí klient (PLC). Server vyhodnotí, že <br>
je to oprávněné připojení a pak se již stará o komunikaci. Tím pádem PLC <br>
může být za firewallem a nemusí mít veřejnou IP. Problém je v tom, že <br>
komunikace běží na pomalém modbusu, takže naprostá většina doby je <br>
čekání na data. Pokud to jsou vlákna, tak to není problém, protože se o <br>
to stará systém a i na prastarém procesoru je vytížení zanedbatelné. <br>
Jenže nedovedu si představit, jak se jedno vlákno bude starat o <br>
komunikaci s několika zcela asynchronně běžícími procesy.<br>
<br>
Jinak tak, jak jste to popsal to funguje, jenže jekmile naslouchací <br>
vlákno identifikuje požadavek a spustí to komunikační, dál se o to <br>
nestará. To je mi jasné, jenže to komunikační vlákno vlastně nikdy <br>
nekončí, protože je to smyčka, která čte data (nebo i zapisuje) z PLC <br>
tak rychle, jak to modbus zvládne. Pokud spojení spadne, vlákno se <br>
ukončí a PLC se pokusí přihlásit znovu a zase dostane vlákno. Tak mě <br>
nenapadá, jak to udělat jinak.<br>
<br>
Martin Záruba<br>
<br>
Dne 10.12.2020 v 7:33 Marek Sembol napsal(a):<br>
> Zdravim,<br>
> Lazara neznam ani omylem, ale: Ono chyba 'out of memory' nemusi nutne <br>
> znamenat, ze dosla pamet obecne. Mnohdy ma program/system vyhrazenou <br>
> statickou (pevne delky) tabulku na nejake prostredky pokud nema volny <br>
> slot - vyhodi out-of-memory (a ma pravdu-dosla mu vyhrazena pamet) Na <br>
> podobny problem jsem narazil jednou s .NET (tehdy jeste 3.5) Program <br>
> pomerne intenzivne (az agresivne) vyuzival thready z ThreadPool. <br>
> Problem byl, ze tam byl taky pevny strop - a jeste zavisly na poctu <br>
> jader. Tusim 256/jadro.<br>
> Obecna rada - ono stejne neni pro system moc zdrave drzet si stabilne <br>
> tolik thready. Kazda sranda (thread) neco stoji. Ten thread dokonce <br>
> relativne dost.<br>
> Takze moje rada vas nepotesi - predelat strukturu programu, aby <br>
> nepotreboval tolik threadu. Neco jako jeden thread na naslouchani a v <br>
> pripade prichoziho pozadavku, si docasne vytvorit (nejlepe pouzit z <br>
> thread pool, pokud lazarus ma, jinak si napsat svuj. Tvoreni thredu je <br>
> hodne drahe) threadik na zpracovani pozadavku a pak ho zas hezky <br>
> vratit/uklidit.<br>
> BR,<br>
> Marek<br>
><br>
> On Thu, Dec 10, 2020 at 6:51 AM Martin Záruba <<a href="mailto:swz@volny.cz" target="_blank">swz@volny.cz</a> <br>
> <mailto:<a href="mailto:swz@volny.cz" target="_blank">swz@volny.cz</a>>> wrote:<br>
><br>
>     Mám v prostředí Lazarus program, který po připojení přes TCP/IP<br>
>     založí<br>
>     vlákno a provede příslušnou akci. Pokud ale počet vláken dosáhne<br>
>     hodnoty<br>
>     115 dostanu zprávu<br>
><br>
>     Project xxx vyvolal výjímku třídy ´EThread´ se zprávou:<br>
><br>
>     Thread creation error: K provedení tohoto příkazu není dost<br>
>     paměťových<br>
>     prostředků<br>
><br>
><br>
>     Jenže ono to nezáleží na paměti. Na různých PC se to chová stejně.<br>
>     Zjevně někde přetečou nějaké tabulky. Ale kde?<br>
><br>
>     -- <br>
><br>
>     Martin Záruba<br>
><br>
>     _______________________________________________<br>
>     HW-list mailing list  -  sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a> <<a href="http://www.HW.cz" rel="noreferrer" target="_blank">http://www.HW.cz</a>><br>
>     <a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a> <mailto:<a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a>><br>
>     <a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
>     <<a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a>><br>
><br>
><br>
> _______________________________________________<br>
> HW-list mailing list  -  sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
> <a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
> <a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</blockquote></div>