Problema con winsock 2005 .NET

sabato 30 settembre 2006 - 13.53

Napster Profilo | Newbie

salve a tutti, ho scaricato da thecodeproject le Winsock 2005 .NET adattabili a VB .NET e compatibil con quasi tutti i computer che hanno installato ovviamente le framework 2.0
le winsock sono come quelle del vb6, addirittura hanno implementato nuove funzioni, il problema ora è questo, quando metto:

Public Sub dataArrival(sender as Object, e As BytesTotal)Handles winsock1.OnDataArrival
Dim a As String
winsock.get(a)
TextBox.text = a
End Sub

e vado ad eseguire il programma, mi dà un errore di thread, la stranezza è ke se metto MsgBox(a) al posto di textbox1.text = a, ricevo un msgbox con la risposta del server, come mai e come posso rimediare?? grazie

mi dà questo errore : "Cross-thread operation not valid: Control CS accessed from a thread other than the thread it was created on

vi allego il progetto ke ho scaricato da codeproject

http://xoomer.virgilio.it/quickurl/Winsock2005DLL.dll

alextyx Profilo | Expert

Non ho esaminato il codice, perchè credo che il problema sia abbastanza chiaro. Il codice con il quale tenti di cambiare la proprietà 'text' della textbox, sta girando nel thread in cui lo winsock lavora. Le prorietà dei controlli di una form, possono essere cambiate solo da codice che gira nello stesso thread in cui è stata creata la form con i suoi controlli. Per superare questo limite devi ricorrere all'uso di una funzione delegata (delegate) e al metodo 'invoke'.
In pratica il tuo è un classico esempio di problema che si incontra lavorando in multi threading. Devi documentarti un po' su questo aspetto, anche per evitare problemi di sincronizzazione nell'accesso a procedure e variabili (vedi 'synclock'). Ciao.

Napster Profilo | Newbie

cm potrei rimediare??

alextyx Profilo | Expert

La mia prima esperienza con i problemi che lamenti tu, mi portò a scrivere alcune righe di codice per sperimentare un metodo che consentisse di ovviare all'impasse dell'impossibilità di accedere alle proprietà di oggetti appartenenti a thread differenti. Nel caso che ti sottopongo, da un thread secondario, vado a cambiare il testo della form. Non dovrebbe essere diverso dal cambiare il testo di una textbox che appartiene alla stessa form. Tuttavia, il multithreading è una pratica avanzata e non andrebbe affrontato col copia e incolla del codice, perchè ci sono molte cose che dovrebbero essere ben comprese prima di avventurarcisi. Comunque, ecco il mio primo lavoretto, sperando che possa esserti di aiuto:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Napster Profilo | Newbie

io ho provato a fare così

Dim a As String <<<---- lo dikiaro a livello di classe Public Sub dataArrival(sender as Object, e As BytesTotal)Handles winsock1.OnDataArrival winsock.get(a) Timer.Enabled = True End Sub Public Sub OnTimerElapsed(...) Timer.Enabled = False TextBox.text = a End Sub

così funziona, xkè??

alextyx Profilo | Expert

Ci sono molti modi x scuoiare un gatto (povera bestia!)
Puoi anche dichiarare una variabile globale, scriverci da un thread e rileggere da un altro. In questi casi, in genere si hanno problemi di sincronizzazione. Per accedere direttamente alle proprietà di un controllo, il codice deve girare nello stesso thread del controllo. Ma si possono ovviamente usare altri escamotage. In genere l'utilizzo di rinfreschi affidati ai timer non è il massimo, ma puoi anche usare un trucco del genere. Ribadisco che per usare il multithreading dovresti prendere il coraggio a due mani e perdere qualche ora leggendo quantomeno dei buoni tutorial. I problemi che possono venire fuori sono veramente bastardi, perchè rischiano di essere sporadici e imprevedibili, proprio per la natura asincrona del codice nei due ( o più) thread. Ad ogni modo, buon lavoro!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5