Plugin im Thread laden

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von AliveDevil.

    Plugin im Thread laden

    Guten Abend,

    ich habe ein Programm welches eine Plugin Schnittstelle hat, bei einem Trigger Event soll eine Funktion in allen Plugins ausgeführt werden, damit dies schnell geschieht wollte ich jedes Plugin in einem Thread laufen lassen.
    Nun ist allerdings die Frage wie ich das machen muss, muss ich das Laden des Plugins bereits in ein Thread machen oder muss ich nur die Aufrufe der Funktion in einen extra Thread auslagern?
    Irgendwie stehe ich da gerade etwas auf dem Schlauch wie ich das machen soll.

    Vielen Dank schonmal für eure Hilfe.

    gruß Dodo
    Okay das mit dem Parallel.For muss ich mir mal genauer ansehen, kurz überflogen verstehe ich es noch nicht so ganz wofür die Start und Endwerte gut sein sollen xD

    Edit: Achne FW 4 geht gar nicht wiel ich ja nur VS2008 habe :P

    Nun ist die Frage wie ich die Thread starten soll, ich habe also eine List(Of Plugins) die ich durchlaufe, wenn ich nun aber neuen Thread starte wird der alte ja überschrieben oder?

    Visual Basic-Quellcode

    1. Dim t As Thread
    2. For Each p As Plugin In Plugins
    3. t = New Thread(AdressOf(StartPlugin), New Object() {p})
    4. Next
    5. Sub StartThread(p As Plugin)
    6. p.TriggerFunction()
    7. End Sub

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

    Das ist einfach ne For-Schleife, allerdings werden die Iterationen parallel ausgeführt. Es ist dabei aber auch ziemlich schlau, denn es werden nicht einfach so viele Threads wie Iterationen erstellt, sondern es laufen immer gerade soviele wie logische Prozessoren zur Verfügung stehen. Die einzelnen Iterationen laufen dann auch garantiert immer auf exakt einem logischen Prozessor, das ist, auch wenns vielleicht erstmal komisch klingt, bei normalen verwalteten Threads nicht unbedingt so (liegt afaik daran, dass ein verwalteter Thread auf verschiedenen unverwalteten laufen kann). Parallel.For ist damit die beste Möglichkeit, Aufgaben auf Listen parallelisiert auszuführen und dabei eine optimale Verteilung auf alle logischen Kerne zu bekommen. Es gibt das ganze übrigens auch noch in der ForEach-Ausführung.
    Das Parallel.For ist für ein paralleles abarbeiten von For i = 0 To 100-Schleifen. In deinem Fall wäre die Parallel.ForEach-Methode wohl geeigneter.
    Ich würde die Plugins beim Programmstart laden, und nicht erst, wenn du die Funktionen aufrufen willst. Wie war denn dein bisheriges Vorgehen?

    EDIT: Jetzt war ich also doch zu langsam. ;) Ich lass es aber trotzdem stehen.
    Ne also geladen sind die natürlich schon vorher, also beim Programm start. Mein bisherige Lösung war

    Visual Basic-Quellcode

    1. For Each p As Plugin In Plugins
    2. p.TriggerFunction()
    3. Next


    Edit: aber wie gesagt im vorigne Post Edit, FW4 kann ich nicht nutzen weil ich nur VS2008 habe. Also muss ich es ja manuell mit Threads machen.
    Ich habe es noch nicht getestet, es war nur eine Annahme das es nicht geht, weil ich nicht genau weiß wie das Handling von Threads ist, wenn ich die Variable mit einem neuen Thread überschreibe, ob der alte dann gestoppt wird.

    List(Of) habe ich mir auch schon gedacht, nur muss ich diese dann ja auch immer aufräumen, nachdem die Funktion durchgelaufen ist soll der Thread ja wieder gelöscht werden.
    Nunja, wenn ich bei jedem Trigger ein neuen Thread erstelle und diesen dann der List(of Thread) hinzufüge, habe ich ja irgendann hunderte Threads dadrin die wohlmöglich ja alle schon durchgelaufen sind, aber deren Instanzen liegen ja noch in der Liste.

    Ich habe es nun allerdings wie im ersten Beispiel von mir gemacht mit einer Variablen in der ein neuer Thread erstellt wird, gestartet und dann geht die For Eahc Schleife weiter, es scheint zu funktionieren, somit komme ich auch um die Liste herum ;)