Problem mit Hindergrundprozess

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von magerquark.

    Problem mit Hindergrundprozess

    hallo leute, ich habe ein kleines problem:

    hier ist mein hintergrundprozess:

    Quellcode

    1. Private Sub positionTurntableBW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles positionTurntableBW.DoWork
    2. While T.isBusy
    3. POSITIONTURNTABLE = T.getPosition
    4. positionTurntableBW.ReportProgress(POSITIONTURNTABLE)
    5. End While
    6. End Sub
    7. Private Sub positionTurntableBW_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles positionTurntableBW.ProgressChanged
    8. Me.TurntablePosition.Text = Format(POSITIONTURNTABLE, "##0.0") & "°"
    9. Call Me.lineTurntable(POSITIONTURNTABLE)
    10. End Sub


    jetzt kommt die frage: wenn ich das einzelt laufen lasse, läuft es wie geschmiert. wenn aber ich das von einem anderen hintergrundprozess laufen lasse, meldet er problem mit der POSITIONTURNTABLE variablen. angeblich benutzt das schon jemand. wie kann man das lösen? Aufrufen tu ich das so:

    Quellcode

    1. Private Sub BW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork
    2. If positionTurntableBW.IsBusy = False Then
    3. positionTurntableBW.RunWorkerAsync()
    4. End If
    5. While positionTurntableBW.IsBusy
    6. Sleep(100)
    7. End While
    8. End Sub


    kann mir jemand sagen woran es liegt? das steht in meinem construktor...

    Quellcode

    1. positionTurntableBW.WorkerReportsProgress = True
    2. positionTurntableBW.WorkerSupportsCancellation = True
    3. BW.WorkerReportsProgress = True
    4. BW.WorkerSupportsCancellation = True


    vielen dank im vorraus. :)
    t ist instanz einer classe, die eine maschiene verwaltet. und diese maschiene kann sich halt drehen. und ich muss in meinem fenster die position anzeigen. aber eigenlich ist es nebensache. mir gehts nur darum, warum wenn ich mein hintergrundprozess (den oberen) einfach starte, läuft er. wenn aber ich von einem anderen hintergrundprozess ihm starte, sagt er das die position gerade benutzt wird. ich ruf ihm ja nicht mehr mals auf.

    vieleicht hilft euch das:
    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TurntablePosition erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

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

    Hier tritt also der Fehler auf?:

    VB.NET-Quellcode

    1. Private Sub BW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork
    2. If positionTurntableBW.IsBusy = False Then
    3. positionTurntableBW.RunWorkerAsync()
    4. End If
    5. While positionTurntableBW.IsBusy
    6. Sleep(100)
    7. End While
    8. End Sub

    Aber da wird die Variable dorch gar nicht verwendet ?
    na ja. anhaltet tut er hier:

    Quellcode

    1. Private Sub positionTurntableBW_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles positionTurntableBW.ProgressChanged
    2. Me.TurntablePosition.Text = Format(POSITIONTURNTABLE, "##0.0") & "°" <<=====================Hier hält er an!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    3. Call Me.lineTurntable(POSITIONTURNTABLE)
    4. End Sub


    das mein ich. eigenlich ist es schon eine globale variable. aber die wird nur von diesem hintergrundprozess benutzt... hab ich vieleicht irgend wo eine einstellung vergessen?
    Hiermit reiche ich mal noch die Saubere Version nach ;D

    VB.NET-Quellcode

    1. Delegate Sub updatelabelhandle(ByVal [text] As String)
    2. Private Sub Updatelabel(ByVal [text] As String)
    3. If Label1.InvokeRequired Then
    4. Dim x As New updatelabelhandle(AddressOf Updatelabel)
    5. Me.Invoke(x, New Object() {[text]})
    6. Else
    7. Label1.Text = [text]
    8. End If
    9. End Sub

    Das kannste dann ausm Backgroundworker per

    VB.NET-Quellcode

    1. UpdateLabel(POSITIONTURNTABLE)

    Aufrufen.