Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Cross-thread
Forum - C# / VB.NET - [VB.NET] Cross-thread

Avatar
I)eathBringer (Normal User)
Pro


Messaggi: 127
Iscritto: 11/08/2008

Segnala al moderatore
Postato alle 19:25
Domenica, 17/04/2011
Salve a tutti. Ho creato una libreria per la conversione da testo a codice morse e viceversa inserendo anche una funzione per scandire la lettura del codice morse in modo che venga generato un evento per ogni azione degna di nota che avviene durante lo scorrimento del codice (ad esempio se in quel momento si sta leggendo un punto o una linea o se il segnale è off...). Il problema è che quando richiamo la libreria in un'applicazione, se inserisco qualche azione (come emettere un segnale acustico) negli eventi generati dalla libreria, mi viene generata un'eccezione di cross-thread. Per ovviare al problema nell'applicazione ho inserito, nella zona di codice interessata, queste righe di codice:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub MorseCode_TickMorse() Handles MorseCode.TickMorseDash, MorseCode.TickMorseDot
  2.         If Me.InvokeRequired Then
  3.             Me.Invoke(New MethodInvoker(AddressOf MorseCode_TickMorse))
  4.         Else
  5.             RadioButton1.Checked = True
  6.         End If
  7.     End Sub


In questo modo il codice funziona ma volevo sapere se c'era un modo per evitare che, in ogni applicazione che utilizza librerie simili a questa, bisognasse inserire quelle righe di codice. Avevo pensato di inserirle direttamente nella libreria ma dovrebbe ereditare da System.Windows.Forms....
Quello che mi lascia più perplesso è che il metodo che ho usato io per scandire il codice dovrebbe essere simile a quello usato per il componente System.Windows.Forms.Timer (almeno credo) ma anche facendo ereditare da System.ComponentModel.Component non sono in grado di utilizzare InvokeRequired e Invoke....
Se non avete capito niente di quello che ho scritto non vi biasimo, non mi sono saputo spiegare meglio. Spero mi sappiate aiutare. Grazie

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 21:45
Domenica, 17/04/2011
In realtà quello che "hai dovuto fare" si deve fare sempre :)
Il motivo è semplice: in .NET è necessario che la GUI venga modificata solo dal thread che l'ha effettivamente creata. Ogni tentativo di modificare oggetti che fanno parte della GUI da un thread diverso solleverà una cross thread exception.

Le righe che hai dovuto scrivere non fanno altro che far invocare la funzione che modifica la GUI al thread che ha creato il form, quindi tutto bene :)


Ma allora come mai un timer non ha bisogno di certe righe quando viene generato un evento Tick? Immagino che anche il timer utilizzi un thread separato (altrimenti non saprei spiegare come possa gestire più azioni contemporaneamente e come possa essere fermato quando si vuole)... - I)eathBringer - 17/04/11 22:55
Perchè evidentemente la classe che implementa il timer si occupa di inviare il messaggio da un thread all'altro al posto tuo - TheKaneB - 18/04/11 01:55
E come si potrebbe fare? - I)eathBringer - 18/04/11 14:26


Ingegnere Informatico
https://ldlagency.it
PM