BackgroundWorker übergabe bzw ausgabe Problem

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Bady.

    BackgroundWorker übergabe bzw ausgabe Problem

    Ich übergebe dem BGW eine Zahl und einen Output String mt:

    VB.NET-Quellcode

    1. Form1.BackgroundWorker2.ReportProgress(1, output.ToString)



    beim abfangen wird dieser output string nur als msgbox angezeigt und nicht in die RichtextBox angefügt!

    VB.NET-Quellcode

    1. If e.ProgressPercentage = 1 Then
    2. MsgBox(e.UserState.ToString)
    3. RichTextBox2.AppendText(e.UserState.ToString & vbNewLine)
    4. Else
    5. RichTextBox2.AppendText(e.UserState.ToString & vbNewLine)
    6. End If



    Weiß jemand wiso das so ist?

    mfg
    GOOGLE ist mein Meister :)
    Du hast offensichtlich (mindestens) 2 BGW. Bist Du in der richtigen ProgressChanged-Prozedur?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja bin ich das ist es ja gerade ^^

    Was ich vielleicht noch dazu sagen sollte is er bekommt den outputstring von von einer klasse zugewiesen.
    Sollte aber auch nicht das problem sein da es ja mit ne msgbox funtzt und auch das

    VB.NET-Quellcode

    1. Else
    2. RichTextBox2.AppendText(e.UserState.ToString & vbNewLine)
    3. End If


    funktioniert.

    Sehe also keinen fehler...
    GOOGLE ist mein Meister :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bady“ ()

    Kannst Du mal bitte etwas mehr Code posten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    im BGW do work:

    VB.NET-Quellcode

    1. SshUtils.ExecCmd("./" & s2)



    in der sshUtils Klasse:


    VB.NET-Quellcode

    1. Public Shared Sub ExecCmd(ByVal strCmd As String)
    2. Dim ssh As SshExec = New SshExec(Form1.TextBox1.Text, Form1.TextBox9.Text, Form1.TextBox10.Text)
    3. ssh.Connect(Form1.TextBox2.Text)
    4. Dim output As String = ssh.RunCommand(strCmd)
    5. If Not output = Nothing Then
    6. Form1.BackgroundWorker2.ReportProgress(1, output.ToString)
    7. End If
    8. ssh.Close()
    9. End Sub



    VB.NET-Quellcode

    1. Private Sub BackgroundWorker2_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker2.ProgressChanged
    2. If e.ProgressPercentage = 1 Then
    3. RichTextBox2.AppendText(e.UserState.ToString)
    4. Else
    5. RichTextBox2.AppendText(e.UserState.ToString & vbNewLine)
    6. End If
    7. End Sub



    Ich hätte es in der klasse eigentlich auch so versucht aber aus irgendeinem grund geht das auch nicht:

    VB.NET-Quellcode

    1. Public Shared Sub ExecCmd(ByVal strCmd As String)
    2. Dim ssh As SshExec = New SshExec(Form1.TextBox1.Text, Form1.TextBox9.Text, Form1.TextBox10.Text)
    3. ssh.Connect(Form1.TextBox2.Text)
    4. Dim output As String = ssh.RunCommand(strCmd)
    5. If Not output = Nothing Then
    6. RichTextBox2.AppendText(output.ToString)
    7. End If
    8. ssh.Close()
    9. End Sub
    GOOGLE ist mein Meister :)
    In welcher Klasse steht diese Prozedur:

    VB.NET-Quellcode

    1. Public Shared Sub ExecCmd(ByVal strCmd As String)
    Hast Du Option Strich On :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Hast Du Option Strich On :?:
    Du musst Form1 als Instanz übergeben und dann darauf zugreifen:

    VB.NET-Quellcode

    1. New SshUtils(Me)
    oder so
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    das wäre eine unnötig enge Kopplung im Sinne von VeryBasics.

    Ich empfehle, den Backgroundworker zu vergessen - der ist bestenfalls innerhalb eines Forms zu was nütze.
    Stattdessen den Thread mit Delegate.BeginInvoke starten - das ist eine zeile Code mehr, und nimmt den Thread aus demselben Threadpool wie der BW.

    Die Klasse sollte ein Event feuern, welches das Form verarbeitet.
    Dabei sorgt entweder die Klasse selbst dafür, dass das Event im Guithread verschickt wird, oder das Form sichert sich gegen einen threadübergreifenden Zugriff ab.
    Ja ich habe Strict On.

    @ErfinderDesRades hsate mal eine schöne Veranschaulichung von Delegate.BeginInvoke?

    mfg
    GOOGLE ist mein Meister :)
    Gut Danke schön. werd ich mr mal ansehen.

    Aber trotzallem geht es mir nicht ein warum er den text in der klasse nicht in die rtb schreibt...


    VB.NET-Quellcode

    1. Public Shared Sub ExecCmd(ByVal strCmd As String)
    2. Dim ssh As SshExec = New SshExec(Form1.TextBox1.Text, Form1.TextBox9.Text, Form1.TextBox10.Text)
    3. ssh.Connect(Form1.TextBox2.Text)
    4. Dim output As String = ssh.RunCommand(strCmd)
    5. If Not output = Nothing Then
    6. Form1.RichTextBox2.AppendText(output.ToString)
    7. End If
    8. ssh.Close()
    9. End Sub
    GOOGLE ist mein Meister :)
    Ok da steht zwar das es zu fehlern kommen könnte wen man dies nun so macht wie ich aber so richtig verstanden hab ich es dennoch nicht....

    Wie oder was sollte man jetzt umschreiben um es richtig zum laufen zu bringen bzw den text in die rtb2 zu schreiben.

    Vielen Dank für eure Mühen mit mir ^^

    mfg
    GOOGLE ist mein Meister :)

    Bady schrieb:

    Ok da steht zwar das es zu fehlern kommen könnte wen man dies nun so macht wie ich aber so richtig verstanden hab ich es dennoch nicht....
    Das bedeutet, du verstehst den Unterschied zw. Objekt und Klasse nicht.
    gugge zeile:

    VB.NET-Quellcode

    1. Form1.BackgroundWorker2.ReportProgress(1, output.ToString)
    Das "Form1" dabei ist kein Objekt, sondern ist eine Klasse, ein Typbezeichner, wie etwa Integer oder String oder Point

    Man kann ja auch nicht schreiben

    VB.NET-Quellcode

    1. Point.Offset(3,3)
    2. 'sondern es heißt
    3. dim pt As new Point(4,3)
    4. pt.Offset(3,3)

    und ebenso wie Point.Offset(3,3) Schwachfug ist, isses auch

    VB.NET-Quellcode

    1. Form1.BackgroundWorker2.ReportProgress(1, output.ToString)

    RodFromGermany schrieb:

    Hast Du Option Strich On :?:

    Wenn Du das nicht hast, ist alles, was Du hier machst, vergebliche Lebensmüh.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    RodFromGermany schrieb:

    Hast Du Option Strich On :?:

    Wenn Du das nicht hast, ist alles, was Du hier machst, vergebliche Lebensmüh.

    Zum 2ten mal Ja habe ich!

    Wie sollte man das den jetzt umbauen um eben auf die rtb in form1 oder auf den bgw in form1 zugreifen zu können?

    mfg
    GOOGLE ist mein Meister :)
    VeryBasics - da stehts: "Kommunikation der Objekte".
    Aber ich habs ja auch direkt hier vorgesagt, nämlich: verpass deiner Klasse ein Event, und abonniere das Event in der Form, die die Klasse instanziert hat.

    zu Events siehe Alles über Events

    Aber damit bin ich jetzt auch draußen aus der Diskussion - mir geht das schon zu sehr in Richtung "Was mussich hinschreiben, dass funktioniert, weil ich bin nicht bereit, mich mit den Hintergründen auseinanderzusetzen."
    Wenn ich diesen Code sehe, glaube ich das nicht:

    Bady schrieb:

    VB.NET-Quellcode

    1. Form1.RichTextBox2.AppendText(output.ToString)
    Entweder Du machst Dir ein Event, in dessen Parameter der anzuzeigende Text mit übertragen wird oder Du arbeitest mit Instanzen der Form:

    RodFromGermany schrieb:

    Du musst Form1 als Instanz übergeben und dann darauf zugreifen:

    VB.NET-Quellcode

    1. New XXX(Me)
    oder so
    So bekommst Du die Instanz rein, diese musst Du Dir dort in einer Klassenvariablen speichern und greifst dann so zu:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class XXX
    2. Private m_frm1 As Form1
    3. Public Sub New(frm As Form1)
    4. m_frm1 = frm
    5. End Sub
    6. Private Sub xyz()
    7. m_frm1.RichTextBox2.AppendText(output.ToString)
    8. End Sub
    9. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!