{"id":1672,"date":"2023-01-03T15:01:16","date_gmt":"2023-01-03T14:01:16","guid":{"rendered":"http:\/\/www.hunggartorino.it\/ql\/?p=1672"},"modified":"2023-01-03T15:01:16","modified_gmt":"2023-01-03T14:01:16","slug":"scambio-messaggi-tra-processi","status":"publish","type":"post","link":"http:\/\/www.hunggartorino.it\/ql\/scambio-messaggi-tra-processi\/","title":{"rendered":"Scambio messaggi tra processi"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Sul QL c&#8217;\u00e8 la possibilit\u00e0 di poter scambiare messaggi tra processi differenti esattamente come avviene tra un server e un client. Anche qui ovviamente si usa la stessa terminologia: un processo &#8220;server&#8221; fornisce informazioni restando in ascolto mentre un processo &#8220;client&#8221; si collega per ricevere informazioni. Sempre con lo stesso principio (ovvero la similitudine con una rete) \u00e8 possibile inviare e ricevere o filtrare messaggi &#8220;broadcast&#8221; inviati in contemporanea a pi\u00f9 processi. Ovviamente, in questo caso non \u00e8 necessario manipolare lo stack tcp\/ip: si programma solo ad alto livello. Per fare ci\u00f2 \u00e8 necessario utilizzare le funzionalit\u00e0 di CSM (acronimo di Client Server Manager): giunto alla sua versione 1.22 e rilasciato nel 1996 permette lo scambio di messaggi \/ informazioni ecc. tra processi superando la limitazione di comunicazione che di default sono 1:1. Qui \u00e8 possibile mandare messaggi a pi\u00f9 processi in contemporanea senza la necessit\u00e0 di aprire in continuazione delle &#8220;pipe&#8221; (canali). Un esempio tipico pu\u00f2 essere un database in cui c&#8217;\u00e8 una tabella (server) e l&#8217;inserimento dati, modifica e query, da una maschera, vengono eseguite lato client inviando le richieste al server. Di seguito vengono elencati i nuovi comandi utilizzabili all&#8217;interno del Basic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CLIENT &#8216;nome'[,buffer]<br>Per l&#8217;oggetto &#8220;nome&#8221; viene associato il ruolo di client. Il buffer di default \u00e8 512 bytes. Se specificato deve essere 32 byte pi\u00f9 grande della pi\u00f9 grande pacchetto di risposta da parte del server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">LISTENER &#8216;nome'[,buffer]<br>Per l&#8217;oggetto &#8220;nome&#8221; viene associato il ruolo di listener che \u00e8 un super-set del ruolo di client. In questo caso il client puo&#8217; ricevere, tramite un meccanismo di interrogazioni (polling) dei messaggi di norma non desiderati di broadcast dal server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">REQUEST &#8216;nome&#8217;,&#8217;comando'[,res$]<br>Si tratta di un comando client di richiesta al server per l&#8217;oggetto &#8220;nome&#8221; con il comando specificato e restituisce il risultato nella variabile res$.<br>Se non viene passato il parametro &#8220;res$&#8221;, il server non restituir\u00e0 alcun risultato<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">res = LSTNPOLL (&#8216;nome&#8217;, bro$, [,timeout])<br>comando listener. Vengono fatte delle interrogazioni (polling) per un messaggio broadcast dal server &#8220;nome&#8221;. Pu\u00f2 essere specificato un parametro di timeout in cicli di clock (1\/50, 1\/60 di secondo) altrimenti rimane in attesa per una richiesta. Il risultato \u00e8 restituito alla variabile res ed ha un valore negativo in caso d&#8217;errore. Il processo listener considera questa variabile in sola lettura. Bro$ \u00e8 il messaggio broadcast<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">context = SRVPOLL (&#8216;nome&#8217;,req$ [,timeout])<br>Comando server. Vengono fatte delle interrogazioni (polling) per le richieste (req$) di un oggetto &#8220;nome&#8221;. La variabile assumer\u00e0 un valore negativo in caso di errore.<br>Se la variabile context assume il valore 0 significa che il client ha effettuato una richiesta di 2 parametri. Questa variabile \u00e8 considerata dal server di sola lettura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SRVREPLY context,res$<br>manda una risposta alla richiesta dal client identificato dal variabile contestuale &#8220;context&#8221;. Un server deve rispondere a tutte le richieste quando il valore contesto \u00e8 positivo, una stringa vuota &#8221; &#8221; \u00e8 una risposta valida<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SRVRBRO &#8216;name&#8217;,bro$<br>comando server. Lancia un messaggio broadcasts &#8216;bro$&#8217; a tutti i LISTENERS<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FREECLIENT &#8216;name&#8217; \/ FREELSTN &#8216;name&#8217;<br>Termina una sessione client o listener di nome &#8220;name&#8221; (NB: in un programma compilato non \u00e8 necessario ma \u00e8 obbligatorio in un programma non binario passato tramite l&#8217;interprete)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FREESERVER &#8216;name&#8217;<br>Termina una sessione server di nome &#8220;name&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">i% = FINDSERVER (&#8216;name&#8217;)<br>controlla la presenza del server &#8220;name&#8221;. La variabile assumer\u00e0 il valore 0 se non verr\u00e0 trovato, 1 se l&#8217;ha trovato, error in caso di errore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">i% = SRVPEND(&#8216;name&#8217;)<br>Controlla se \u00e8 presente una sequenza di richieste polling fatte da SRVPOLL. La variabile avr\u00e0 valore 0 se non ci sono dati, 1 se ci sono dati o error in caso di errore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio di programmazione:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>     IF FINDSERVER('QFAX') = 1 THEN\n      CLIENT 'QFAX'\n      REQUEST 'QFAX','SUSPEND'\n      REMark set QTPI exitparam to resume it\n      FREECLIENT 'QFAX'\n     ELSE\n      IF FINDSERVER('SMON') = 1 THEN\n       REMark SMBOX\n       etc<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"Sul QL c&#8217;\u00e8 la possibilit\u00e0 di poter scambiare messaggi tra processi differenti esattamente come avviene tra un server e un client. Anche qui \n<a class=\"moretag\" href=\"http:\/\/www.hunggartorino.it\/ql\/scambio-messaggi-tra-processi\/\"> [..more...]<\/a>","protected":false},"author":3,"featured_media":1070,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-1672","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-senza-categoria-it"],"_links":{"self":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts\/1672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/comments?post=1672"}],"version-history":[{"count":1,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts\/1672\/revisions"}],"predecessor-version":[{"id":1673,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts\/1672\/revisions\/1673"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/media\/1070"}],"wp:attachment":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/media?parent=1672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/categories?post=1672"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/tags?post=1672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}