Process.Start in extra Thread

Ich hab das OutputStringHandler jetzt so geändert:
Code:
    Private Sub OutputStringHandler(ByVal sendingProcess As Object, ByVal outLine As DataReceivedEventArgs)
        TextBox1.Text &= outLine.ToString
    End Sub

Aber jetzt bekomme ich:
Fehler hat gesagt.:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TextBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

Oder muss ich das anders machen?
 
Das ist jetzt ein anderer Thread, daher musst du den Zugriff auf das Formular und damit auch die Textbox per "Invoke" und Delegate durchführen.
 
Mit dem ganzen Threading und den Delegates komme ich leider überhaupt nicht klar und das ganze Funktioniert einfach alles nicht wie es soll. Jetzt kommt nichtmal mehr die Meldung "finished"....
 
Ich komme trotzdem mit dem ganzen nicht klar. Das einzigste was ich wollte, ist das mein Programm eine externe Datei mit Parametern ausführt und die Ausgabe in eine Textbox schreibt und dabei mein Programm nicht einfriert. Was mich irritiert ist halt das gesagt wurde, ich brauch keinen Extra Thread sondern kann die asynchrone Lestemethode benutzen, aber da kommt dann plötzlich auch wieder die Meldung das es in einem Extra Thread ausgeführt wird.... Ich versteh das alles irgendwie ga rnicht mehr... *verzweifel*:confused:
 
Hi

Also:
Wenn das Programm nur am Ende irgendwas ausgibt, kannst du das Exited Event nutzen. Dies wird im gleichen Thread wie der Aufruf.
Die Asynchonen Methoden laufen in einem anderen Thread, da sonst kein Aufruf stattfinden kann. Wenn dein Programm permanent Ausgaben macht (über einen längere Zeit), solltest du diesen Weg gehen und dich mit dem Thema Threading auseinander setzen. Von: "ich komm damit nicht klar" wirds jedenfalls nix ;)
 
Wie genau funktioniert dieses Exited Event? Kannst du mir einen kleines Stück Code geben in dem einfach die Ausgabe nach Beendigung in eine Textbox geschrieben wird?
 
Also ich hab das mit hilfe des Beispiels jetzt so gemacht:
Code:
    Private WithEvents Run As New Process
    Private elapsedTime As Integer
    Private eventHandled As Boolean


    Private Sub RunApp(ByVal Befehl As String, ByVal Parameter As String)
        elapsedTime = 0
        eventHandled = False


        Run.StartInfo.FileName = Befehl
        Run.StartInfo.Arguments = Parameter
        Run.StartInfo.UseShellExecute = False
        Run.StartInfo.CreateNoWindow = True
        Run.StartInfo.RedirectStandardOutput = True
        Run.StartInfo.RedirectStandardError = True
        Run.EnableRaisingEvents = True

        Run.StartInfo.RedirectStandardInput = True

        Run.Start()

        'TextBox1.Text &= Run.StandardOutput.ReadToEnd() & vbCrLf
        'TextBox1.Text &= Run.StandardError.ReadToEnd() & vbCrLf


        'TextBox1.SelectionStart = Len(TextBox1.Text)
        'TextBox1.ScrollToCaret()
        'TextBox1.Focus()
        'Application.DoEvents()
        'Run.WaitForExit()
        Const SLEEP_AMOUNT As Integer = 100
        Do While Not eventHandled
            elapsedTime += SLEEP_AMOUNT
            'If elapsedTime > 3000 Then
            'Exit Do
            'End If
            System.Threading.Thread.Sleep(SLEEP_AMOUNT)
        Loop
        'TextBox1.Text = Run.StandardError.ReadToEnd()
    End Sub

    ' Handle Exited event and display process information.
    Private Sub Run_Exited(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Run.Exited

        eventHandled = True
        MessageBox.Show("Finished" & vbCrLf & "Elapsed time: " & Run.ExitTime & " | " & Run.ExitCode & " | " & elapsedTime)
    End Sub

Aber das programm friert trotzdem noch ein.... =(
 
Code:
Do While Not eventHandled
            elapsedTime += SLEEP_AMOUNT
            'If elapsedTime > 3000 Then
            'Exit Do
            'End If
            System.Threading.Thread.Sleep(SLEEP_AMOUNT)
        Loop
ja, und zwar hier!
Was willst du damit bezwecken?
Du bremst damit selbst dein Programm aus!
Nochmal der Hinweis: Nutz auch den Debugger um sowas zu finden!
 

Neue Beiträge

Zurück