Threads und Pointer auf Objekte

Hallo,

ich arbeite mit Visual C++ 6.0 und möchte eine Methode in einen Thread auslagern. Da ich in dem Thread auf diverse Methoden und Attribute des aufrufenden Objektes zugreifen möchte, übergebe ich einen Pointer auf das Objekt als Parameter (this).

HANDLE a\_hThread[1]; 
DWORD a\_dwThreadID = 0;
a\_hThread[0] = CreateThread( NULL,
 0, 
 StartThread,
 (LPVOID)this,
 0,
 &a\_dwThreadID );

Meine Thread- Methode ist wie folgt deklariert:

DWORD WINAPI StartThread(LPVOID pCMC\_TestDlg)

Über den Pfeiloperator kann ich jetzt problemlos auf die Eigenschaften des Objektes zugreifen.

CMC\_TestDlg\* dlg1 = (CMC\_TestDlg\*)pCMC\_TestDlg;
dlg1-\>attr1;

Wenn ich aber auf Methoden meines Objektes zugreifen möchte, hängt sich das Programm auf. Hat jemand eine Idee warum?

Vielleicht liegt mein Problem auch schon im Ansatz. Meine Klasse wird in einer Headerdatei deklariert. Ich hab anfangs probiert, die Thread- Methode in der Headerdatei zu deklarieren und dann einzubinden. Dann bekomme ich aber die Fehlermeldung:
‚CreateThread‘ : Konvertierung des Parameters 3 von ‚unsigned long (void *)‘ in ‚unsigned long (__stdcall *)(void *)‘ nicht möglich.
Ich hab noch diverse andere Möglichkeiten ausprobiert (Methode statisch, …), was aber alles nicht zum Erfolg geführt hat. Die momentane Realisierung sieht so aus, dass die Thread- Methode nicht in der Headerdatei deklariert ist, sondern nur in der cpp- Datei implementiert. So läuft der Thread auf jeden Fall erstmal.

Vielleicht hat jemand ne Idee, wo mein Fehler liegt.

Danke und Gruß
ziba

Hallo,

ich arbeite meistens mit Delphi, daher gehe ich auf den C+±Code nicht direkt ein, aber in Delphi gilt wie wahrscheinlich auch in anderen Sprachen: jede Instanz einer Klasse enthält die Eigenschaften (als Tabelle), die Methodentabelle wird aber für die Klasse nur einmal gespeichert. M.a.W. ein Zeiger auf die Instanz zeigt auf die Eigenschaften, aber zu den Methoden führt erst ein weiterer Zeiger - meines Wissens ist der hinter den Eigenschaften aufgeführt. Es ist also logisch, dass eine Derefenzierung eines Pointers für die Methoden nicht ausreicht.

Um weiteres hat sich der Compiler zu kümmern, ich weiss aber in deinem Fall nicht, wie du ihn dazu kriegst, tatsächlich auf die Methodentabelle der Klasse zuzugreifen.

Gruss Reinhard

Hallo Reinhard,

danke für die Antwort. Das Problem scheint aber eher in der Kombination von Threads und Objektreferenzen als bei den Objektreferenzen allein zu liegen.
Wenn ich eine Methode normal aufrufe (ohne Threads) und ihr als Parameter den Pointer auf ein Objekt übergebe, dann kann ich ohne Probleme auch dessen Methoden per Pfeil- Operator aufrufen.

Werd noch mal weitersuchen und notfalls mein Programm umbauen.

Gruß
ziba

Hallo,

danke für die Antwort. Das Problem scheint aber eher in der
Kombination von Threads und Objektreferenzen als bei den
Objektreferenzen allein zu liegen.
Wenn ich eine Methode normal aufrufe (ohne Threads) und ihr
als Parameter den Pointer auf ein Objekt übergebe, dann kann
ich ohne Probleme auch dessen Methoden per Pfeil- Operator
aufrufen.

Werd noch mal weitersuchen und notfalls mein Programm umbauen.

Du musst auf jeden Fall aufpassen, dass deine Variable, die du dem Thread übergibst nicht im Stack liegt und somit zerstört wird, bevor sie im Thread benutzt wird. Sprich die Funktion, die den Thread startet ist zuende, und löscht die Stack Variablen, da ja nun alles asynchron läuft.
Dazu musst du aufpassen, dass nicht zwei Funktionen gleichzeitig auf bestimmte Funktionen/Eigenschaften des Objekts zugreifen und sich somit gegenseitig während der Arbeit die Variablen ändern -> Crash. Hierfür gibts in der Windows API die „Critical Section“ :wink:

mfg,
Christoph