ParamterizedThreadStart mit mehreren Parametern



  • Hallo leute...

    stehe vor einem schweren problem wo ich jetzt schon einige tage dran rumrätsle...
    vielleicht kann mir von euch jemand helfen...

    Also ich habe eine WindowsForm mit einem Button. Der Button startet einen Thread. Im Thread werden einige Berechnungen ausgeführt (DSP berechnungen). Und ergebnisse davon sollen dann in der Windowsform (textbox, label, progressbar sonstiges...) angezeigt werden.
    soweit so gut, probiert habe ich zuerst mit der normalen ThreadStart methode und delegates... das funktionierte bei mir nicht wirklich, kam mir auch zu umständlich vor für jede textbox ein eigenes delegate zu erstellen...

    gut, dann halt mal ein beispiel mit ParamterizedThreadStart. Funktionierte gut, konnte aus dem Thread jede textbox und sonstiges ansprechen.
    super dachte ich...
    musste aber bei beim Thread starten das objekt "this" übergeben.

    leider muss ich für meine Berechnungen auch noch eine referenz auf einen buffer übergeben welche ich aus einer dll bekomme die ich nicht beeinflussen kann.

    heisst: &procThreadParams

    also brauch ich mit ParameterizedThreadStart zwei sachen. einmal das objekt "this" und einmal "&procThreadParams"

    leider schaff ich es nicht beides an meinen Thread zu übergeben 😞
    mit strukturen und klassen hab ich schon probiert... allerdings scheitert es immer daran das objekt mit zu übergeben... die referenz auf den buffer der dll scheint irgendwie nicht so das problem zu sein...
    das objekt "this" brauche ich aber um die windows forms zu steuern...

    hat da vielleicht jemand eine lösung dafür? suche mir schon seit tagen die finger wund und komme auf keine lösung 😞

    auf c# umsteigen ist relativ unmöglich, weil ich erstens performance für meine berechnungen brauche, und zweitens die vorhandene dll unmanaged ist und mit pointern usw. arbeitet und das in c# sehr mühevoll ist (schon probiert aber wieder aufgegeben)

    naja, auf jeden fall schon mal danke fürs thread lesen, aber mehr würde ich mich natürlich über eine hilfestellung freuen 😃

    gruß st0ne



  • Nutz ein pair, ne struct oder ne klasse mit 2 elementen: this und Dein 2. Parameter.



  • Was auch gehen würde wäre ein Object-Array. Allerdings hast du dann keine Typsicherheit und musst dir die entsprechenden Objekte erst wieder aus dem Array holen.



  • hallo,

    danke für die antworten!

    sollte das dann in etwa so aussehen?

    ref struct	threadparams
    {
    	ProcThreadParams *tparams;
    	property System::Object ^ sysobj;
    };
    

    und dann so:

    threadparams foobar;
    foobar.sysobj = this;
    foobar.tparams = &procThreadParams;
    

    und dann so:

    Thread^ newThread1 = gcnew Thread(gcnew ParameterizedThreadStart(&ThreadProc1 ));
    newThread1->Start(foobar);
    

    ich weiß nur nicht ob ich das system object richtig deklariert habe im struct 😕

    gruß st0ne



  • habs mal mit dem struct probiert...
    da hat er leider das selbe gemeckert wie bei der class mit dem ich das jetzt auch probiert habe...

    error C3352: "void Test::Form1::ThreadProc1(Test::threadparams ^)": Die angegebene Funktion stimmt nicht mit dem Delegattyp "void (System::Object ^)" überein.
    

    ParamterizedThreadStart hat als typ System::Object^ und da kann ich wohl keine eigene klasse übergeben??

    irgend eine idee wie man das umgehen kann?



  • so, ich hab jetzt die parameter drüben im thread... allerdings mit einer thread klasse und nicht mit parameterizedthreadstart...

    jetzt möchte ich mein "this" objekt neu instanzieren mit:

    Form1 ^ob = (Form1^) sysobj;
    

    geht aber nicht da folgender fehler kommt:

    error C2065: 'Form1': nichtdeklarierter Bezeichner
    

    gut, dachte man muss es dann so machen:

    Test::Form1 ^ob = (Test::Form1^) sysobj;
    

    geht auch nicht 😞

    error C2039: 'Form1': Ist kein Element von 'Test'
    

    schön langsam dreh ich durch! schon eine woche verschissen mit dem blöden thread problem 😞


Anmelden zum Antworten