Threads in Klassen



  • Hallo,

    ich habe hier ein Problem mit mehreren Threads in einer Klasse.

    Klasse "Kamera" hat zwei Threads. Ein Thread nimmt ein Bild über Firewire auf,
    nur einmal und geht dann mit goto an den Threadstart und warte mit
    WaitForSingleObject auf das nächste CaptureEvent. Ein zweiter Thread löst in
    einer Schleife immer ein CaptureEvent aus, womit der erste Thread wieder ein
    Bild aufnimmt. Um auf die verschiedenen Handles und Variablen zuzugreifen
    verwende ich Pointer. Das heißt ich habe keine Membervariable

    HANDLE CAMERA;

    sondern

    HANDLE *ptrCamera;

    damit ich auch von aussen auf den Inhalt zugreifen kann. Das Problem ist jetzt,
    dass wenn ich den ersten Thread starte, welcher immer nur ein Bild aufnimmt,
    dann hat dieser immer die richtigen Werte an den gespeicherten Adressen. Wenn
    ich aber den Thread mit der Captureschleife starte, dann ändert sich ständig
    der Inhalt an den Stellen der gespeicherten Adressen in diesem Thread
    (Schleifenthread). Ich brauche auch nicht den EinzelCaptureThread starten, dass
    Ergebnis bleibt das gleiche.

    Hab schon alles durchgesucht und leider nichts zu diesem speziellen Fall
    gefunden. Hab das Gefühl das es etwas mit dem Stack zu tun hat, aber ich weiß
    nicht wo ich anfangen soll zu suchen.



  • Also ich habe es hinbekommen. Der Grund für das ständige Ändern der
    Speicherbereiche war, dass ich zwar den Zeiger auf mein Klassenobjekt übergeben
    habe, aber dieser Zeiger und der Speicherbereich anscheinend vor der Übergabe
    kopiert wurden. Ich habe es jetzt so gelöst das ich eine weitere Membervariable
    hinzugefügt habe und dieser im Konstruktor meiner Klasse gleich den Zeiger auf
    mein Objekt übergebe. Anstatt beim erzeugen des Threads dann den Zeiger auf
    "this" zu übergeben, übergebe ich den Inhalt in der genannten Membervariable.
    Damit habe ich die richtige Startadresse meines Objektes im Thread.

    Das wird wahrscheinlich noch nicht die beste Lösung sein. Vielleicht weiß jemand
    eine bessere Idee.



  • Habe die Problemstelle erkannt. Ich hatte, komischer Weise, in meinem Code eine
    Instanz meiner Klasse erzeugt und nicht initialisiert. Diese wurde dann
    anscheinen auch auf den Stack geschmissen und ich habe immer mit dieser
    weitergearbeitet. Hab das herausgefunden, nachdem ich in den Kontruktor der
    Klasse debugged habe und dann per Callstack gesehen hab, welche Stelle den Fehler
    verursacht.

    Also sollte jemand zufälliger Weise auf diesen Beitrag stoßen:
    DANN SCHAU DIR ERST GENAU DEINEN CODE AN UND VERSTEHE AUCH WAS DU MACHST.

    Und tschüss.



  • DANN SCHAU DIR ERST GENAU DEINEN CODE AN UND VERSTEHE AUCH WAS DU MACHST.

    Was für eine Schlussfolgerung. Die sollte an allen Schulen auf der Welt gepredigt werden.


Anmelden zum Antworten