Thread-Aufruf mit Parametern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von bigbasti.

    Thread-Aufruf mit Parametern

    Moinsen

    Ich wollt mir via Threading rechen intensive Funktion auslagern
    bei nem pipapo Reportviewer klappt das alles auch einwandfrei mit folgendem Code

    VB.NET-Quellcode

    1. Synclock (Me)
    2. Dim thread_BerichtErzeugen As New Thread(AddressOf Me.Erzeuge_Historienbericht)
    3. thread_BerichtErzeugen.Start(tblFirmen & ".KundenID = " & Me.nKundenID)
    4. End Synclock


    Signatur
    Spoiler anzeigen
    Private Function Erzeuge_Historienbericht(ByVal strHistorieFilter As String) As Boolean


    Wenn ich dieses Muster nun auf aber auf einen Klassenaufruf übernehmen will

    VB.NET-Quellcode

    1. Dim t As New Thread(AddressOf clRegion.SucheRegiondurchPLZ)
    2. t.Start(New Object() {prgfrm, arrStats, nModus})


    Signatur
    Spoiler anzeigen
    Public Function SucheRegiondurchPLZ(ByVal prgfrm As CCDBLibrary.Form_07_SYS_Progress, ByRef nStatistik() As Long, ByVal Modus As Long) As Boolean


    Hier kommt dann die folgende Fehlermeldung
    Spoiler anzeigen
    Fehler 8 Fehler bei der Überladungsauflösung, da keine zugreifbare "New" mit diesen Argumenten aufgerufen werden kann:
    "Public Sub New(start As System.Threading.ParameterizedThreadStart)": Die Signatur der Public Function SucheRegiondurchPLZ(prgfrm As CCDBLibrary.Form_07_SYS_Progress, ByRef nStatistik() As Long, Modus As Long) As Boolean-Methode ist mit dem Delegaten "Delegate Sub ParameterizedThreadStart(obj As Object)" nicht kompatibel.
    "Public Sub New(start As System.Threading.ThreadStart)": Die Signatur der Public Function SucheRegiondurchPLZ(prgfrm As CCDBLibrary.Form_07_SYS_Progress, ByRef nStatistik() As Long, Modus As Long) As Boolean-Methode ist mit dem Delegaten "Delegate Sub ThreadStart()" nicht kompatibel. C:\Projects\Form_102_MNU_Admin.vb 215 13


    Irgendwie bin ich hier recht beschränkt, wäre für jede Hilfe dankbar ^^

    MfG ChrizzleWhizzle

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

    Du übergibst deine Paramter auch nicht der Methode clRegion.SucheRegiondurchPLZ sondern Thread.Start.
    Und Thread.Start benötigt andere Parameter ;)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

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

    Du startest den Thread mit ein ObjectArray als Parameter

    VB.NET-Quellcode

    1. t.Start(New Object() {prgfrm, arrStats, nModus})


    Deine Funktion erwartet 3 Parameter:

    VB.NET-Quellcode

    1. Public Function SucheRegiondurchPLZ(ByVal prgfrm As CCDBLibrary.Form_07_SYS_Progress, ByRef nStatistik() As Long, ByVal Modus As Long) As Boolean


    Das kann ja nicht klappen, hm?

    Ich denke dir fehlen einige Grundlagen..

    //EDIT @fichz: Auch Quatsch
    Das ist meine Signatur und sie wird wunderbar sein!
    Beim Reportviewer Code erwartet die Funktion einen Parameter vom Typ String.
    Da du kein Option Strict On verwendest, funktioniert diese implizite Konvertierung auch...

    Der springende Punkt ist, dass du dort aber auch genau einen Parameter übergibst.
    Das ist die Grundlage für Funktionen.
    Du kannst nicht weniger Parameter übergeben als erwartet werden
    Das ist meine Signatur und sie wird wunderbar sein!
    So wie du es hast, ist es definitiv nicht möglich.
    Du kannst nicht nach dem VarNamen und nach dem Typen () verwenden.

    Ich sage nicht das du es so machen solltest/sollst.
    Ich kenn dein Programm nicht und weiss nicht genau, was du machst.

    Das einzige was ich sehe ist, dass dir Grundlagen fehlen..und du offensichtlich nicht weisst, was du tust :)
    Deine ursprünglich Funktion hat ja auch ein ByRef Array als Param.
    Das sieht mir sehr nach VB6 Stil aus.

    Möglicherweise wäre eine eigene Klasse als Parameter am sinnvollsten.

    So ohne weiteres kann ich dir nicht sagen, was die beste Lösung ist.
    Das ist meine Signatur und sie wird wunderbar sein!
    Die Frage welche sich mir nun aber stellt, ist
    wie muss ich denn nun meinen thread deklarieren damit ich die Funktion aufrufen kann oder muss ich die Parameter der Funktion ändern?

    EDIT:
    hrmpf neue Problem xD

    Momentan sieht es so aus

    Button_click -> neuer thread(addressof abc)
    abc(
    code ...
    aufruf der regionszuweisung)

    wenn ich nun aber auch nur ein einziges mal auf die Wait-Form klicke hängt sich das Programm auf :S

    Exception wird keine geschmissen

    HELP ^^


    Edit by LaMa5:
    - Bitte keine Doppelpost's, es gibt eine 'Bearbeiten' Funktion (Boardregeln §4.1e)
    --> Beiträge zusammengefügt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „LaMa5“ ()