Discussione:
Collegamento via socket tcp che dopo 10 secondi si stacca
(troppo vecchio per rispondere)
RobertoA
2021-10-21 16:11:02 UTC
Permalink
Procedura Access, che chiamero' A, al suo interno dispone di un socket
tcp server realizzato usando MsWinsck.dll
Il codice e' il classico:

--------------------------------------------------
Set tcpServer = New MSWinsockLib.Winsock
tcpServer.Protocol = sckTCPProtocol
tcpServer.LocalPort = Me.txtPorta
tcpServer.Listen

E poi quando c'e' la richiesta connessione:
tcpServer.Accept requestID

E quando arrivano dati:
tcpServer.GetData stringa_dati
--------------------------------------------------

E programma esterno che chiamero' B, in esecuzione sullo stesso pc dove
sta girando A, che si collega come 'socket client' e scambia dati
Bene, funziona tutto, il programma esterno si collega e chiacchera
correttamente con la procedura Access
C'e' un problema pero' quando la procedura Access e' 'impegnata' a fare
qualcosa, come una query lunga o comunque un'operazione che dura piu' di
10 secondi, la connessione via socket viene interrotta
Poi quando la query e' finita ed il controllo ritorna al programma
allora riparte anche la connessione

La domanda e': quel tempo di 10 secondi, dopo il quale se il codice sta
lavorando e non rilascia il controllo viene interrotta la connessione,
e' modificabile?
@Alex
2021-10-21 17:16:32 UTC
Permalink
Non so se parliamo dello stesso Winsock in quanto io usavo un Ocx e nonnla DLL che se non ricordo male era pubblicata su VBAccelerator... quindi resto un poco nel dubbio.

Temo tuttavia ci sia qualche cosa che non torna... hai dichiarato la variabile tcpServer ereditando gli eventi e tracciando l'evento ERROR...?
Credo appunto che vada in errore, in quel caso basta intercettare l'errore e farla ripartire...

Se ho frainteso nin ho modo di replicare il problema...

@Alex
RobertoA
2021-10-22 10:15:46 UTC
Permalink
Post by @Alex
Non so se parliamo dello stesso Winsock in quanto io usavo un Ocx e nonnla DLL che se non ricordo male era pubblicata su VBAccelerator... quindi resto un poco nel dubbio.
Temo tuttavia ci sia qualche cosa che non torna... hai dichiarato la variabile tcpServer ereditando gli eventi e tracciando l'evento ERROR...?
Credo appunto che vada in errore, in quel caso basta intercettare l'errore e farla ripartire...
Se ho frainteso nin ho modo di replicare il problema...
@Alex
Si hai ragione, e' l'ocx non una dll
Ma in tutti gli esempi trovati non vedo l'evento ERROR
Trovo:
- ConnectionRequest
- Close
- DataArrival

Ho provato a metterci un

Sub tcpServer_Error()
End Sub

ma spara fuori subito un errore dicendo di non conoscere l'evento
Sei sicuro ci sia anche l'evento ERROR?
@Alex
2021-10-22 12:26:01 UTC
Permalink
Post by RobertoA
Post by @Alex
Non so se parliamo dello stesso Winsock in quanto io usavo un Ocx e nonnla DLL che se non ricordo male era pubblicata su VBAccelerator... quindi resto un poco nel dubbio.
Temo tuttavia ci sia qualche cosa che non torna... hai dichiarato la variabile tcpServer ereditando gli eventi e tracciando l'evento ERROR...?
Credo appunto che vada in errore, in quel caso basta intercettare l'errore e farla ripartire...
Se ho frainteso nin ho modo di replicare il problema...
@Alex
Si hai ragione, e' l'ocx non una dll
Ma in tutti gli esempi trovati non vedo l'evento ERROR
- ConnectionRequest
- Close
- DataArrival
Ho provato a metterci un
Sub tcpServer_Error()
End Sub
ma spara fuori subito un errore dicendo di non conoscere l'evento
Sei sicuro ci sia anche l'evento ERROR?
Roberto, per il codice che hai scritto... secondo me è un componente COM quello che usi, ovvero una Dll Activex, e non un OCX da inserire nella Form come Oggetto, altrimenti non avresti questa dichiarazione:
Set tcpServer = New MSWinsockLib.Winsock

Quindi credo tu abbia dichiarato la variabile [tcpServer] As MSWinsockLib.Winsock...?
In questo caso devi, come ti ho accennato sopra, dichiararne anche l'eredità di Eventi con WithEvents

Private WithEvents tcpServer As MSWinsockLib.Winsock

Se usi la dichiarazione tardiva definendolo Object non puoi e perdi gli eventi... una volta fatto l'Oggetto [tcpServer] espone non solo proprietà e metodi ma anche Eventi, ed apparirà Error...

Purtroppo non ho alcun modo di verificare e vado molto a memoria... e logica, spero sia la strada giusta.

@Alex
RobertoA
2021-10-22 14:05:55 UTC
Permalink
https://www.vbforums.com/showthread.php?743903-RESOLVED-Winsock-Problem
Se questo non è utile, temo ti servirà implementare un sistema di INVIO "SPAM" per mantenere la connessione, da scartare dal Client ovviamente, ma quì entra poi il problema dell'impossibilità di Access di gestire il MultiThread... di conseguenza, devi assicurarti che, nel codice che tu chiami LOOP LUNGO, ci sia SEMPRE un DoEvents che consente al S.O. ed al codice MonoThread di eseguire le azioni prioritarie.
Di più non so aggiungere non potendo fare prove fisiche.
@Alex
Gia'
Grazie per l'aiuto
RobertoA
2021-10-24 17:58:47 UTC
Permalink
Post by RobertoA
https://www.vbforums.com/showthread.php?743903-RESOLVED-Winsock-Problem
Se questo non è utile, temo ti servirà implementare un sistema di INVIO "SPAM" per mantenere la connessione, da scartare dal Client ovviamente, ma quì entra poi il problema dell'impossibilità di Access di gestire il MultiThread... di conseguenza, devi assicurarti che, nel codice che tu chiami LOOP LUNGO, ci sia SEMPRE un DoEvents che consente al S.O. ed al codice MonoThread di eseguire le azioni prioritarie.
Di più non so aggiungere non potendo fare prove fisiche.
@Alex
Gia'
Grazie per l'aiuto
Ciao,
hai valutato di lanciare una applicazione Access secondaria che faccia solo quello, a mo di servizio?
Il problema della mancanza del multithread in access inizia a diventare effettivamente un problema.
Questo, insieme a una gestione molto più intelligente ed elastica delle tabelle SQL collegate con ODBC dovrebbero essere, a mio giudizio, le più urgenti innovazioni da inserire in Access.
Ciao
Davide
Considerato il fatto che i 'blackout' nella connessione non sono
frequenti, ma solamente in coincidenza con l'avvio di query
particolarmente lente, basta rendere piu' sprintose le query
ottimizzandole un pochetto oppure avvertire l'operatore
A mio avviso pure uno zoom sui report sarebbe il benvenuto
Maaah.. sembra sempre di essere l'ultima ruota del carro
Davide La Mantia
2021-12-09 00:08:53 UTC
Permalink
Il giorno domenica 24 ottobre 2021 alle 19:58:51 UTC+2 RobertoA ha scritto:
---OMISSIS---
Post by RobertoA
Maaah.. sembra sempre di essere l'ultima ruota del carro
Sì, in effetti più volte mamma MS ha tentato di scaricare Access, salvo rendersi conto ogni volta che è un prodotto che funziona.
Ora con tutti i servizi in abbonamento che vendono, secondo me lo vedono quasi come un concorrente, e per questo non svilupperanno mai una vera interfaccia web, come avevano iniziato a fare quasi vent'anni orsono, e sempre per questo hanno abbandonato gli adp.
Access con una gestione ottimizzata delle tabelle SQL e una vera interfaccia web diventerebbe un mostro contro cui schiantarsi quando si propongono servizi on line a pagamento.

Ciao

Continua a leggere su narkive:
Loading...