Backgroundworker oder Async für zeitkritische Anwendungen?

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Ich weiß nicht ob mein Zeitvorteil dadurch groß genug wäre.
    Kann man alle drei parallel laufen lassen? Also HandleRückmeldung parallel zu HandleDrucker und beide parallel zum Hauptthread.

    Wie gesagt, es sind beide Prozeduren (HandleDrucker und HandleRückmeldung) vollkommen unabhängig voneinander und greifen auf keine gemeinsamen Ressourcen zu. Der eine Prozess müsste also nicht auf den Abschluss des Anderen warten.

    RiLo schrieb:

    Der eine Prozess müsste also nicht auf den Abschluss des Anderen warten.
    Ich dachte, Drucken wartet mittelbar auf ein Startsignal der SPS?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RiLo schrieb:

    Ich weiß nicht ob mein Zeitvorteil dadurch groß genug wäre[...] greifen auf keine gemeinsamen Ressourcen zu...
    Naja - mehrere HandleDrucker parallell laufen zu lassen - das wäre schon erstaunlich, wenn dein SPS-System da nicht das spinnen anfangen würde.
    Aber möglich ist das.
    Habe in post#12 ja gezeigt, wie das geht.
    HandleDrucker fragt "zyklisch" in der SPS an, ob ein neuer Druckauftrag benötigt wird.

    HandleRückmeldung findet nicht an der Stelle statt, an der gedruckt wird, sondern im Maschinenablauf zwei Stationen später.
    Das meinte ich damit, dass kein Prozess auf den anderen wartet.
    HandleRückmeldung ist es vollkommen egal, ob ein Aufdruck auf dem Werkstück ist. Das wird an anderer Stelle durch einen Scanner kontrolliert.
    @RiLo Das kommt mir alles sehr bekannt vor. ;)
    Nun, nachdem Du eine Reihe von Fragen und Hinweisen bekommen hast:
    Formuliere noch mal das Problem Deiner Anfrage hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades : Ich habe es noch nicht ausprobiert. Lese mich gerade erst etwas in die Thematik Async/Await ein. Zu Post #12 noch kurz: Eine SPS ist eine SpeicherProgrammierbare Steuerung. Durch das Gerät werden die Anlagen gesteuert. Bekanntester Vertreter ist wahrscheinlich die Siemens S7.

    @xmise: Die Daten der Rückmeldung kommen auch aus der SPS. Ist aber "nur" ein Doppelwort an der Stelle.

    @RodFromGermany: Inwiefern kommt dir das bekannt vor? Kennen wir uns womöglich?

    Die Anforderung kurz und knapp neu definiert:

    In einer Prozedur "Zyklus", aufgerufen durch einen Timer (Intervall=1s), werden zwei weitere Prozeduren "HandleDrucker" und "HandleRückmeldung" aufgerufen, welche derzeit linear abgearbeitet werden, aber mit der neuen Lösung parallel laufen sollen. Keine der beiden Prozeduren muss auf irgendeine Art und Weise auf die Fertigstellung der anderen warten. Der Drucker sitzt im Maschinenverlauf an Stelle x und die Rückmeldung wird an Stelle y ausgelöst. (x=während einer anderen Bearbeitung des Werkstückes, y=Abstapelung des Werkstückes)

    Mein Problem dabei ist nur die Parallelilät der beiden Prozeduren zu gewährleisten.

    RiLo schrieb:

    Kennen wir uns womöglich?
    Nö.
    Ich habe mal Projekte bearbeitet, in denen es sehr ähnliche Probleme und Vorgehensweisen gab.

    RiLo schrieb:

    Mein Problem dabei ist nur die Parallelilät der beiden Prozeduren zu gewährleisten.
    Wenn die nichts miteinander zu tun haben (x und y) ist das nicht erforderlich!


    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Wenn die nichts miteinander zu tun haben (x und y) ist das nicht erforderlich!


    Anscheinend ja doch. Sonst wäre der Drucker nicht durcheinander gekommen bei der linearen Verarbeitung.
    Wenn er nicht rechtzeitig einen neuen Auftrag für das Werkstück geschickt bekommt, druckt er einfach das Vorherige nochmal.
    Irgendwo bei diesen magischen 6s muss der Knackpunkt liegen.

    Ich werde das in den nächsten Tagen mal ausprobieren. Genug Input habt ihr mir ja gegeben ;)

    Danke erstmal

    Vielleicht an dieser Stelle doch noch etwas Code zum besseren Verständnis:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Timer1.Enabled = False
    3. tsslUhrzeit.Text = Now
    4. Timer1.Interval = 1000
    5. Zyklus()
    6. Timer1.Enabled = True
    7. End Sub
    8. Private Sub Zyklus()
    9. HandleDrucker() ' <-- dauert ca. 5s
    10. HandleRueckmeldung() '<-- dauert ca. 1s
    11. 'hier folgen noch ein paar andere Sachen, Auftragsverwaltung etc.
    12. End Sub


    Vielleicht ist es auch noch wichtig zu erwähnen, dass das Werkstück nicht liegen bleibt, sondern am Drucker vorbeifährt und während der Fahrt bedruckt wird (Tintenstrahl). Und ca. alle 6s kommt ein neues Werkstück gefahren.

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

    RiLo schrieb:

    Wenn er nicht rechtzeitig einen neuen Auftrag für das Werkstück geschickt bekommt, druckt er einfach das Vorherige nochmal.
    Dann sorge einfach dafür, dass in diesem Falle nichts zu drucken da ist.
    Oder einfach dies (Syntax nicht getestet !):

    VB.NET-Quellcode

    1. Private Async Sub Zyklus()
    2. Await New Task(HandleDrucker())
    3. Await New Task(HandleRueckmeldung())
    4. 'hier folgen noch ein paar andere Sachen, Auftragsverwaltung etc.
    5. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!