Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Inventor .NET
  Problem mit Backgroundworker

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Problem mit Backgroundworker (591 mal gelesen)
DerBrain87
Mitglied
Mathematiker


Sehen Sie sich das Profil von DerBrain87 an!   Senden Sie eine Private Message an DerBrain87  Schreiben Sie einen Gästebucheintrag für DerBrain87

Beiträge: 73
Registriert: 29.04.2015

Inventor 2017 & VisualStudio 2013

erstellt am: 17. Okt. 2017 12:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,
ich habe ein AddIn für Inventor, welches zunächst eine Exceldatei einließt und dann eine GUI startet, in welcher ich eine beliebige Menge der in der Exceldatei vorhandenen Punkte auswählen kann, diese bei Wunsch noch verschieben und dann als Arbeitspunkte in das offene Bauteil einträgt. Da die Exceldatei mitunter mehrere tausend Punkte beinhalten kann, habe ich bereits ein kleines Warteformular erstellt, in welchem man nicht nur sieht wie weit der Fortschritt ist, sondern sogar die Möglichkeit hat, den Vorgang zu unterbrechen. Dies ermöglliche ich über eine Membervariable welche zu jeder Zeit abgefragt werden kann. Soweit funktioniert es auch hervorragend.
Meine Konstrukteure, für welche ich das Programm schreiben hätten gerne eine Vorschau-Funktion. Dies heißt für mich, sobald genügend Informationen in der GUI sind, damit mein Programm weiß, was ich alles Zeichnen möchte, zeichne ich die Punkte. Hier kommt es zum Problem...

Mein Problem:
Wählt der Benutzer viele Punkte und wechselt die Einstellungen während die Vorschau erstellt wird, kachelt mein Programm (oder wahlweise die ganze DIVA) ab.

Mein Ansatz: Backgroundworker
Die Idee: Ich lasse im Hintergrund einen Backgroundworker laufen, welcher schaut ob Daten dargestellt werden sollen. Wenn ja, wählt er sich die aktuellsten (alle älteren verwirft er) und stellt diese da. Kommen während des Zeichnen der Punkte Neue, bricht er die aktuelle Liste ab und startet die Neue. Das habe ich über eine Membervariable (Linkedlist) der GUI gelöst. Der Backgroundworker an sich startet, sobald die GUI startet. Sind keine Daten zum Verarbeiten da, lasse ich den Backgroundworker 0,1 Sekunde schlafen. Schicke ich dem Backgroundworker eine Liste, zeichnet er diesen auch brav. Ist die Liste durch und ich schicke ihm eine andere klappt auch alles wunderbar. Lediglich, wenn ich dem Backgroundworker eine neuere Liste schicke, während er noch an der alten 'knabbert' schmiert er ab. Setze ich ein Try-Catch um den Bereich, stelle ich fest, dass ich auf die bereits vorhanden Workpoints keinen Zugriff mehr hab. Hiermit meine ich nicht, dass meine Variable Nothing wird (dem ist nämlich nicht so) sondern viel mehr, dass so simple Eigenschaften wie Name zu folgender Fehlermeldung führen: "Unbekannter Fehler (Ausnahme von HRESULT: 0x80004005 (E_FAIL))".
Mein Verdacht ist, dass es irgendwie an dem Multithreading liegt. Ich muss gestehen, dass ich in diesem Gebiet alles andere als ein Experte bin.

Kann mit jemand Helfen? Wenn ich nicht bald den Fehler oder wenigstens eine Lösung finde, befürchte ich, ich muss entweder die Vorschau-Option rausmachen, oder soweit eingefrieren, dass immer erst die alte Vorschau fertig erstellt werden muss. Beides finde ich jetzt keine so elegante Lösung...

Hier noch den (minimal abgespeckte) Quellcode den ich habe:

Code:

Imports System.Windows
Imports System.Collections.Generic

Public Class frmZeichnePunkte
    Private Const SPALTE_ELEMENT_BEZEICHNUNG As Integer = 4
    Private Const SPALTE_TRASSE As Integer = 5
    Private Const SPALTE_RHO As Integer = 10
    Private Const SPALTE_SMOK As Integer = 11
    Private Const SPALTE_FSL As Integer = 14
    Private Const SPALTE_FSR As Integer = 17
    Private Const SPALTE_TR As Integer = 20

    Private mDaten As Object(,)
    Private mApplication As Inventor.Application
    Private mDocument As Inventor.Document

    Private mTransactionManager As Inventor.TransactionManager
    Private mTransaction As Inventor.Transaction
    Private mWarteschlange As New LinkedList(Of Object())

    Public Sub New(oApplication As Inventor.Application, oDocument As Inventor.Document, oDaten As Object(,))

        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()
        FuelleForm()

' Initialisierung von Inventor
        mApplication = oApplication
        mDocument = oDocument
        mTransactionManager = oApplication.TransactionManager
        mTransaction = mTransactionManager.StartTransaction(oDocument, "zeichne Punkte für Raster")

        mDaten = oDaten

        BaWorkZeichnen.RunWorkerAsync()
    End Sub

    Private Sub berechnePunkte()
        Dim neuerTag As Object() = {}
        Dim data As Object(,), count as Long = 0
        data = getDaten(CoBox_Standard_Von.SelectedIndex, CoBox_Standard_Bis.SelectedIndex, count)
If count = 0 Then _
    Exit Sub
        mTransaction.Abort()
        mTransaction = mTransactionManager.StartTransaction(mDocument, "zeichne Punkte für Raster")
        mWarteschlange.AddLast({data, count})
    End Sub

    Private Sub CoBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TaConEinstellung.SelectedIndexChanged,
                                                                                    CoBox_Standard_Von.TextChanged, CoBox_Standard_Bis.TextChanged, ChBox_Standard_Ausrichtung.TextChanged, CoBox_Standard_Ausrichtung.SelectedIndexChanged, TeBox_Standard_Ausrichtung.TextChanged,
                                                                                    CoBox_Benutzerdefiniert_Von.TextChanged, CoBox_Benutzerdefiniert_Bis.TextChanged,
                                                                                    ChBox_Vorschau.CheckedChanged
        Dim state As Boolean = CoBox_Standard_Von.SelectedIndex >= 0 AndAlso CoBox_Standard_Bis.SelectedIndex >= 0

        CoBut_Anwenden.Enabled = state

        ' Vorschau ggf. aktualisieren
        If ChBox_Vorschau.Checked AndAlso state Then _
            erstellePunkte()
    End Sub


    Private Sub BaWorkZeichnen_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles BaWorkZeichnen.DoWork
        Dim oTransientGeometry As Inventor.TransientGeometry = mApplication.TransientGeometry
        Dim oTransactionManager As Inventor.TransactionManager = mApplication.TransactionManager

        Do
            If mWarteschlange.Count = 0 Then
                Threading.Thread.Sleep(100)
            Else
                Dim data As Object(,), count As Long
                Do
                    Dim akt As Object() = mWarteschlange.First.Value : mWarteschlange.RemoveFirst()
                    data = akt(0)
                    count = akt(1)
                Loop While mWarteschlange.Count > 0

                Dim oTransaction As Inventor.Transaction = oTransactionManager.StartTransaction(mDocument, "zeichne Punkte")
                Dim oFrmFortschritt As New frmFortschritt("0 von " & count & " Punkte eingefügt")
                Dim oWorkPoints As Inventor.WorkPoints = ermittleWorkPoints(mDocument)
                'mApplication.ScreenUpdating = False

                For i = 0 To count - 1
                    Dim oPoint As Inventor.Point = oTransientGeometry.CreatePoint(data(i, 1) / 10, data(i, 2) / 10, data(i, 3) / 10)
                    Dim verschoben As Boolean = False
                    Dim oWorkPoint As Inventor.WorkPoint = Nothing
                    For Each oWorkPoint In oWorkPoints
                        Dim punktname As String = ""
'                        Try
                            punktname = oWorkPoint.Name
'                        Catch ex As Exception
'                            MsgBox("WP-Name nicht zugreifbar")
'                            punktname = ""
'                        End Try

                        If Not punktname = "" AndAlso punktname = data(i, 0) Then
                            Dim oFixedWorkPointDef As Inventor.FixedWorkPointDef = DirectCast(oWorkPoint.Definition, Inventor.FixedWorkPointDef)
                            oFixedWorkPointDef.Point = oPoint
                            verschoben = True
                            Exit For
                        End If
                    Next

                    If Not verschoben Then
                        oWorkPoint = oWorkPoints.AddFixed(oPoint)
                        oWorkPoint.Name = data(i, 0)
                        oWorkPoint.Grounded = True
                    End If
                    oFrmFortschritt.setzeFortschritt((i + 1) / count, i + 1 & " von " & count & " Punkte eingefügt/verschoben")

                    If oFrmFortschritt.Abbruch OrElse mWarteschlange.Count > 0 Then
                        MsgBox("Warteschlange erweitert")
                        oTransaction.Abort()
                        oFrmFortschritt.Close()
                        mApplication.ScreenUpdating = True
                        Continue Do
                    End If
                Next

                oTransaction.End()
                oFrmFortschritt.Close()
                mApplication.ScreenUpdating = True
                mDocument.Update()
                updateBrowserPane(mDocument)
            End If
            Loop
       
    End Sub



Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Tacker
Mitglied
TZ, Tech. MB, Softwareentwickler


Sehen Sie sich das Profil von Tacker an!   Senden Sie eine Private Message an Tacker  Schreiben Sie einen Gästebucheintrag für Tacker

Beiträge: 175
Registriert: 23.09.2010

IV 2015 & IV 2017 Pro
i7-7700K 4x4.2GHz
32GB DDR4-2400
GTX 1060 6GB DDR5

erstellt am: 19. Okt. 2017 11:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für DerBrain87 10 Unities + Antwort hilfreich

Hallo 

Bin selbst auch noch nicht so ganz vertraut mit dem Multithreaden, aber denke der Fehler liegt darin, dass 2 Threads gleichzeitig auf Inventor zugreifen. Sinnvoll wäre hier ein Task zu erstellen und den gegebenenfalls abzubrechen: https://msdn.microsoft.com/de-de/library/dd997396(v=vs.110).aspx

https://stackoverflow.com/questions/10835800/how-do-i-stop-cancel-a-task-processing-a-function-or-find-a-better-way-of-doing

Task abbrechen, Punkte bereinigen, neuer Task starten.

Ich hoffe das hilft.

MFG

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

DerBrain87
Mitglied
Mathematiker


Sehen Sie sich das Profil von DerBrain87 an!   Senden Sie eine Private Message an DerBrain87  Schreiben Sie einen Gästebucheintrag für DerBrain87

Beiträge: 73
Registriert: 29.04.2015

Inventor 2017 & VisualStudio 2013

erstellt am: 23. Okt. 2017 15:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Tacker,
ich sehe leider nicht, dass mehrere Threads auf Inventor zugreifen. Meines Erachtens nach, arbeitet nur der Backgroundworker mit der DIVA.
Die Links zu den Tasks werde ich mir aber durchaus mal anschauen bei Gelegenheit und evtl. klappt es ja - auch wenn meines Verständis nach Tasks für was anderes sind^^

Gruß DerBrain87

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Tacker
Mitglied
TZ, Tech. MB, Softwareentwickler


Sehen Sie sich das Profil von Tacker  an!   Senden Sie eine Private Message an Tacker  Schreiben Sie einen Gästebucheintrag für Tacker

Beiträge: 175
Registriert: 23.09.2010

IV 2015 & IV 2017 Pro
i7-7700K 4x4.2GHz
32GB DDR4-2400
GTX 1060 6GB DDR5

erstellt am: 24. Okt. 2017 11:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für DerBrain87 10 Unities + Antwort hilfreich

Ich beschäftige mich auch erst seit ner guten Woche aktiv damit, hab ich vorher nicht gebraucht    ist aber schon ein bisschen ein Thema mit Gehirnknotengefahr.

Halt mich aufm Laufenden, interessiert mich woran es scheitert.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2020 CAD.de | Impressum | Datenschutz