none
Threading/Synchronisierung Problem RRS feed

  • Frage

  • Hallo,

    ich habe in meinem Mainthread eine Funktion A die ein "Langläufer" sein kann. Nun möchte ich parallel dazu einen neuen Thread mit Funktion B starten, welche eine Prüfung durchführt, die nach Ablauf der Funktion A ausgewertet werden soll und diesbezüglich dann weiteren Code ausführt.

    Wie macht man so was, wenn

    a) es sein kann, dass die Funktion A schneller ist als B (dann müsst A auf das Ergebnis von B warten) bzw.

    b) die Funktion B (normalerweise immer) schneller ist als A und das Funktionsergebnis in eine noch laufende Funktion B zurückgeben soll?

     

    Danke

    Reinhard

    Dienstag, 28. September 2010 09:59

Antworten

  • Hallo Reinhard,

     

    das geht mit einem BackgroundWorker.

    http://www.der-softwareentwickler-blog.de/2008/11/03/video-tutorial-multithreading-mit-vbnet-und-backgroundworker/

    oder

    als Video:

    http://www.youtube.com/watch?v=RMIOVVLhUvE

    Deine weiteren Fragen ergeben sich voraussichtlich hieraus.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    • Als Antwort markiert ReinhardH Dienstag, 28. September 2010 14:24
    Dienstag, 28. September 2010 10:07
  • Hallo Reinhard,
    ok, und in Sub BinFertig würde ich dann auf den 2ten Event warten, sprich also etwas wie

    If BinFertig_A AND BinFertig_B then ...

    Richtig verstanden?

    Jein :) Man wartet nicht in einer Sub, sondern reagiert einfach auf die Events. Wenn Du bspw. erst dann etwas machen willst, wenn beide Events ausgelöst wurden, kann man das in etwa so machen:

    Class MachWas
    
      Dim IstAFertig As Boolean = False
      Dim IstBFertig As Boolean = False
    
      Public Event BinFertig( ByVal MethodName As String )
    
      Public Sub A()
        ...
        RaiseEvent BinFertig( "A" )
      End Sub
      
      Public Sub B()
        ...
        RaiseEvent BinFertig( "B" )
      End Sub
      
      Public Sub BinFertig( ByVal MethodName As String ) Handles Me.BinFertig
    
        If MethodName = "A" Then
          IstAFertig = True
        End if
    
        If MethodName = "B" Then
          IstBFertig = True
        End if
    
        If IstAFertig AndAlso IstBFertig Then
          ' --- Anstoßen der Nachverarbeitung
          ...
        End if
    
      End Sub
    
    End Class
    
    
    Wie gesagt, das ist natürlich kein Beispiel, dass man genau so einsetzen würde, es soll nur einen möglichen Weg zeigen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert ReinhardH Dienstag, 28. September 2010 14:23
    Dienstag, 28. September 2010 12:56
    Moderator

Alle Antworten

  • Hallo Reinhard,

     

    das geht mit einem BackgroundWorker.

    http://www.der-softwareentwickler-blog.de/2008/11/03/video-tutorial-multithreading-mit-vbnet-und-backgroundworker/

    oder

    als Video:

    http://www.youtube.com/watch?v=RMIOVVLhUvE

    Deine weiteren Fragen ergeben sich voraussichtlich hieraus.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    • Als Antwort markiert ReinhardH Dienstag, 28. September 2010 14:24
    Dienstag, 28. September 2010 10:07
  • Hallo Stefan,

    vielen Dank. Der BackgroundWorker scheint eine Lösung zu sein, wenn ich davon ausgehen kann, dass immer die Funktion B vor A fertig wird.

    Dann könnte ich eine boolsche Variable dementsprechend setzen. Was aber nicht funktioniert wäre wenn A vor B fertig wird, da ich dann noch nicht wüsste, was B für ein Ergebnis liefert.

    Eine andere Idee?

    Danke

    Reinhard

    Dienstag, 28. September 2010 10:53
  • Hallo Reinhard,
    Was aber nicht funktioniert wäre wenn A vor B fertig wird, da ich dann noch nicht wüsste, was B für ein Ergebnis liefert.

    ich würde das eher über Events lösen. Starte Methode A, dann Methode B. Methode B löst, wenn sie soweit durch ist, ein Event aus, welches Du dann behandeln kannst.

    In deiner Klasse würde das in etwa so aussehen:

    Class MachWas
    
      Public Event BinFertig( ByVal MethodName As String )
    
      Public Sub A()
        ...
        RaiseEvent BinFertig( "A" )
      End Sub
    
      Public Sub B()
        ...
        RaiseEvent BinFertig( "B" )
      End Sub
    
      Public Sub BinFertig( ... ) Handles Me.BinFertig
        ...
      End Sub
    
    End Class
    
    
    Das ist natürlich nur ein minimales Beispiel, welches nur zeigen soll, wie das in etwa aussehen könnte. Die Aufteilung des Codes sollte natürlich noch überdacht und angepasst werden (bspw. Auslagerung in separate Klassen mit eigenen Events, Integration per Dim WithEvents ...). Wie das aussehen sollte, hängt aber von deinen Anforderungen ab.

    Weitere Infos zu Events, ... findest Du hier:

      http://msdn.microsoft.com/de-de/library/ms172877.aspx

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 28. September 2010 11:06
    Moderator
  • Hallo Stefan,

     

    ok, und in Sub BinFertig würde ich dann auf den 2ten Event warten, sprich also etwas wie

    If BinFertig_A AND BinFertig_B then ...

    Richtig verstanden?

    Gruß

    Reinhard

    Dienstag, 28. September 2010 12:45
  • Hallo Reinhard,
    ok, und in Sub BinFertig würde ich dann auf den 2ten Event warten, sprich also etwas wie

    If BinFertig_A AND BinFertig_B then ...

    Richtig verstanden?

    Jein :) Man wartet nicht in einer Sub, sondern reagiert einfach auf die Events. Wenn Du bspw. erst dann etwas machen willst, wenn beide Events ausgelöst wurden, kann man das in etwa so machen:

    Class MachWas
    
      Dim IstAFertig As Boolean = False
      Dim IstBFertig As Boolean = False
    
      Public Event BinFertig( ByVal MethodName As String )
    
      Public Sub A()
        ...
        RaiseEvent BinFertig( "A" )
      End Sub
      
      Public Sub B()
        ...
        RaiseEvent BinFertig( "B" )
      End Sub
      
      Public Sub BinFertig( ByVal MethodName As String ) Handles Me.BinFertig
    
        If MethodName = "A" Then
          IstAFertig = True
        End if
    
        If MethodName = "B" Then
          IstBFertig = True
        End if
    
        If IstAFertig AndAlso IstBFertig Then
          ' --- Anstoßen der Nachverarbeitung
          ...
        End if
    
      End Sub
    
    End Class
    
    
    Wie gesagt, das ist natürlich kein Beispiel, dass man genau so einsetzen würde, es soll nur einen möglichen Weg zeigen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert ReinhardH Dienstag, 28. September 2010 14:23
    Dienstag, 28. September 2010 12:56
    Moderator
  • Hallo Stefan,

    danke, das meinte ich. :) Allerdings wirft deine Anmerkung

    >Wie gesagt, das ist natürlich kein Beispiel, dass man genau so einsetzen würde, es soll nur einen möglichen Weg zeigen.

    die Frage auf, Warum nicht? Was spricht dagegen?

    Danke

    Reinhard

    Dienstag, 28. September 2010 13:14
  • Hallo Reinhard,

    Allerdings wirft deine Anmerkung

    >Wie gesagt, das ist natürlich kein Beispiel, dass man genau so einsetzen würde, es soll nur einen möglichen Weg zeigen.

    die Frage auf, Warum nicht? Was spricht dagegen?

    Normalerweise bricht man das, insbesondere bei Multithreading, noch mehr auf. D.h. die Methoden werden ggfs. ausgelagert, damit sie sich nicht gegenseitig in die Quere kommen, gemeinsam genutzte Resourcen könnten hier bspw. Probleme machen. Im Endeffekt müsste also jede Methode für sich autark laufen können. Wenn Du bspw. in beiden Methoden schreibend auf (ein) Objekt(e) in der Klasse zugreifst, könnte das zu Problemen führen (Deadlocks oder ähnliches). Wenn Du das so berücksichtigt hast, Ok :)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 28. September 2010 14:05
    Moderator
  • Hallo Stefan,

    besten Dank - dann werde ich mich mal auf die Threads .. äh Socken machen und Threads programmieren.

    Ich bin mir sicher, dass ich Deadlocks oder ähnliches dabei habe, aber wie schon Plato sagte

    Ich kenne keinen sicheren Weg zum Erfolg, nur einen zum sicheren Mißerfolg - es jedem recht machen zu wollen.

    Gruß

    Reinhard

    Dienstag, 28. September 2010 14:23