Announcement

Collapse
No announcement yet.

Backgroundworker - COM-dll-Funktionsaufruf

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Backgroundworker - COM-dll-Funktionsaufruf

    Hallo Leute,

    vielleicht kann mir jemand von euch weiterhelfen:

    Ich habe ein kleines Tool mit einer Winforms-Oberfläche. Dieses Toll ruft auf Button-Click ein paar Funktionen aus einer COM-dll auf. Da diese Funktionen unter Umständen einen längeren Prozess beinhalten, habe ich einen Thread im Hintergrund bzw. einen Backgroundworker (BGW) angelegt, damit die UI nicht einfriert. Leider tut sie das trotzdem!?

    Ich greife auf die UI-Elemente lediglich durch die "ProgressChanged"-Eventhandlerroutine des BGW zu.

    Habt Ihr eine Idee an was das liegen kann.

    Danke.

    Gruß Jonathan

  • #2
    Hi,

    wie rufst du denn den Backgroundworker auf?

    Wenn du so deinen Prozess aufrufst, dann sollte es eigentlich keine Probleme geben:

    [highlight=vbnet]


    Private WithEvents bgw As New BackgroundWorker


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    bgw.WorkerReportsProgress = True

    bgw.RunWorkerAsync()


    End Sub


    Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork

    funktion_die_unglaublich_lange_dauert()

    End Sub

    Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged

    'Von hier aus kann auf die Windows Form zugegriffen werden
    textbox1.text = e.ProgressPercentage


    End Sub


    sub funktion_die_unglaublich_lange_dauert()

    for i as integer = 0 to 50000000000
    bgw.ReportProgress(100)
    next
    end sub


    [/highlight]

    Comment


    • #3
      Hallo Optimist,

      danke für die Antwort. Rein prinzipiell habe ich es so geschrieben. Ich versuch's mal aus dem Kopf, da ich den originalen Code nicht hier habe:

      [highlight=vbnet]
      Public Class Form1
      Private WithEvents m_BGW As System.ComponentModel.BackgroundWorker
      Private m_CDC As New COMDllClass

      Private Sub BearbeitungStarten()
      m_BGW = New System.ComponentModel.BackgroundWorker
      m_BGW.WorkerReportsProgress = True
      m_BGW.WorkerSupportsCancellation = True
      m_BGW.RunWorkerAsync()
      End Sub


      Private Sub m_BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles m_BGW.DoWork
      m_CDC.Abarbeiten()
      End Sub


      Private Sub m_BGW_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles m_BGW.ProgressChanged
      'Update ein Label oder ähnliches
      End Sub
      End Class

      Public Class COMDllClass
      Public Sub Abarbeiten()
      'Sub die viel Zeit kostet, aber in einer ausgelagerten COM-Dll sitzt
      End Sub
      End Class
      [/highlight]

      Ich würde jetzt mal rein optisch und funktionell behaupten, das ist das gleiche/selbe, das Du geschrieben hast, allerdings bekomme ich trotzdem den Freeze, wenn ich das Programm ausführe...
      Wenn ich die Funktionsaufrufe in der "DoWork"-Funktion in einer Schleife aufrufe und zwischendrin noch was kurzweiliges anderes mache, dann reagiert die App für einen kurzen Augenblick, biss wieder die Dll-Funktion aufgerufen wird...

      Gruß Jonathan
      Zuletzt editiert von syboowa; 04.04.2011, 21:42.

      Comment

      Working...
      X