Multithreading - Objekt geht verloren



  • verd**, ich hatte gehofft, das mit dem Multithreading halbwegs im Griff zu haben, aber offenbar habe ich noch ein paar Probleme:

    //Hauptfunktion:
    MyFilter* pFilt = new MyFilter();
    //einige Initialisierungen für pFilt
    AfxBeginThread(work,pFilt);
    
    //Arbeitsfunktion:
    UINT work(LPVOID param)
    {
      MyFilter* pFilt = (MyFilter*)param;
      ...
    }
    

    (Wie man sieht, erstelle ich per new ein Objekt und will es dann in meiner Thread-Funktion verwenden)

    Das Problem:
    In der Hauptfunktion wird das Objekt ordnungsgemäß initialisiert. Allerdings hat das, was meine Thread-Funktion dann bekommt, überhaupt keine Ähnlichkeit mehr mit diesem Objekt - die Elemente sind teilweise mit 0 belegt, teilweise mit irgendwelchem Datenmüll (überprüft im Debugger - die angegebenen Adressen stimmen überein). Wie komme ich jetzt an meinen Filter heran?



  • Klingt seltsam. Und die Initialisierungen stimmen auch und erzeugen keinen Müll, Überlauf, oder so?



  • Ja, soweit ich das beurteilen kann - zumindest stehen unmittelbar vor dem BeginThread-Aufruf noch die richtigen Werte in meinem Filter.



  • Und wenn du schrittweise die Anzahl der zu initialisierenden Variablen erhöhst?
    Also erst eine Variable erhöhen -> schauen, ob es im Thread richtig ist.
    Dann eine zweite hinzunehmen, dann eine dritte, usw.



  • Schwierig - ein halb initialisiertes Objekt nützt weder dem Hauptprogramm noch der Thread-Funktion etwas.

    *geht etwas testen*

    Wenn ich einen int* übergebe, kommen die richtigen Daten an. 😕



  • Du sollst ja nur überprüfen, ob die Variablen die Werte behalten.
    Also, die Initialisierung ändern, Thread aufrufen, im Debugger die Werte anschauen, dann je nach ergebnis fortfahren. Nur zum Testen. 😉
    Ich vermute nämlich immer noch einen Überlauf.



  • Eine Teil-Initialisierung ist etwas schwierig, da ein großer Teil davon schon im Konstruktor der Basisklasse passiert.

    *bastelt um*

    Puh - ich glaube, ich hab' den Fehler gefunden - ich habe wohl die Polymorphie etwas überreizt (das Objekt war in einem IBaseFilter* untergebracht und dort war wohl eine Adressverschiebung drin).



  • Herzlichen Glückwunsch!


Anmelden zum Antworten