Benutzer mit den meisten Antworten
Threading/Synchronisierung Problem

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
Antworten
-
Hallo Reinhard,
das geht mit einem 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
-
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:
Wie gesagt, das ist natürlich kein Beispiel, dass man genau so einsetzen würde, es soll nur einen möglichen Weg zeigen.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
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
Alle Antworten
-
Hallo Reinhard,
das geht mit einem 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
-
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
-
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: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.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
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 -
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:
Wie gesagt, das ist natürlich kein Beispiel, dass man genau so einsetzen würde, es soll nur einen möglichen Weg zeigen.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
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
-
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
-
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 -
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