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 Exeption
Forum - C# / VB.NET - [VB.NET] Cross-thread Exeption

Avatar
Brenza (Normal User)
Rookie


Messaggi: 21
Iscritto: 30/10/2010

Segnala al moderatore
Postato alle 20:59
Mercoledì, 16/03/2011
Ciao a tutti, sto creando un programma in vb.net  e sono incappato in un problema che proprio non riesco a risolvere.

Nel form 1 ho dichiarato una TextBox e un Process, il mio obbiettivo è quello di lanciare un processo esterno (ping.exe) e di memorizzarne in in real-time l'output all'interno della textbox.


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Codice sorgente - presumibilmente C# / VB.NET

  1. startInfo.FileName = Environ("WINDIR") & "\system32\ping.exe"
  2. startInfo.Arguments = "127.0.0.1"
  3. startInfo.CreateNoWindow = True
  4. startInfo.UseShellExecute = False
  5. startInfo.RedirectStandardOutput = True
  6. Process1 = Process.Start(startInfo)
  7. Process1.BeginOutputReadLine()
  8. Process1.WaitForExit()



Private Sub Process1_OutputDataReceived(ByVal sender As System.Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles Process1.OutputDataReceived
If Not e.Data Is Nothing Then TextBox1.text += e.Data.ToString
End Sub


Per evitare il Cross-thread Exeption ho implementato la sub SetText per modificare la TextBox
Codice sorgente - presumibilmente VB.NET

  1. Private Sub SetText(ByVal [text] As String)
  2.     if Me.TB.InvokeRequired Then
  3.          Dim d As New SetTextCallback(AddressOf SetText)
  4.          Me.Invoke(d, New Object() {[text]})
  5.     Else : TextBox1.Text += [text] & vbCrLf
  6.     End If
  7. End Sub
  8.  
  9. Delegate Sub SetTextCallback(ByVal [text] As String)




Il problema è che l'istruzione
Codice sorgente - presumibilmente Plain Text

  1. Process1.WaitForExit()

blocca il funzionamento dell'intero programma (l'istruzione va in contrasto con quella per leggere l'output), ne ho assoluamente bisogno in quanto ho in programma di eseguire diversi processi uno dopo l'altro assicurandomi che non coesistano mai.
Solutions? :d


EDIT: Ho pensato a backgroundworking e a streamreader ma non riesco a fare quello che voglio.

Ultima modifica effettuata da Brenza il 16/03/2011 alle 21:06
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 21:10
Mercoledì, 16/03/2011

ma che serve tutto sto casino? esiste la classe Ping: http://msdn.microsoft.com/it-it/library/system.net.network ...


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
Brenza (Normal User)
Rookie


Messaggi: 21
Iscritto: 30/10/2010

Segnala al moderatore
Postato alle 19:05
Giovedì, 17/03/2011
Il ping è un esempio per illustrare il problema, devo usarlo per altre cose.. :yup:

PM Quote
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Segnala al moderatore
Postato alle 20:58
Giovedì, 17/03/2011
edit

Ultima modifica effettuata da Question il 03/04/2011 alle 17:49


Ma ovviamente x64
PM Quote
Avatar
Brenza (Normal User)
Rookie


Messaggi: 21
Iscritto: 30/10/2010

Segnala al moderatore
Postato alle 21:49
Giovedì, 17/03/2011
Se ho capito bene mi suggerisci di cambiare
Codice sorgente - presumibilmente C# / VB.NET

  1. Me.Invoke(d, New Object() {[text]})
  2. in
  3. TextBox1.Invoke(d, New Object() {[text]})



Se è così purtroppo non cambia nulla, se non faccio eseguire l'istruzione waitforexit va alla grande ma se la abilito si pianta tutto.. ç___ç


Sembra ci siano dei problemi con la lettura asincrona dell'output del processo e questa istruzione

Ultima modifica effettuata da Brenza il 17/03/2011 alle 21:55
PM Quote