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 MembervariableHANDLE 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.