Threads und externe Funktionsaufrufe mit parametern



  • Hallo,

    ich benutze VS2008 C++ und habe in einem Programm einen Thread erzeugt. Dazu verwendet ich folgenden Funktionsaufruf im Konstruktor der Klasse.

    hThread = (HANDLE)_beginthreadex(NULL,0,ComLogic::ThreadStaticEntryPoint,(LPVOID)&number,0,&dwThreadID);
    

    Der Thread wird dann auch wie gewünscht gestartet. Nun möchte ich aus dem Thread eine Methode aufrufen, die zu einem Objekt gehört das ich dem Objekt in dem der Thread läuft beim erzeugen übergeben habe. Das Objekt wird auch gefunden,jedoch klappt die Übergabe von pointern in das entfernte Objekt bzw. Methode nicht. Liegt es daran, das beide in unterschiedlichen Threads laufen? Wie kann ich das problem umgehen?

    Danke!


  • Mod

    Wenn number ein Objet ist wird die Adresse auch an den Thread übergeben.
    Die Frage ist eher wie hat Du number deklariert?
    Ist die Variable auf dem Stack angelegt? Dann ist die vermutlich schon wieder ungültig, wenn die Funktion, die beginthread aufruft terminiert.

    Das Objekt muss natürlich mindestens so lange leben wie auch der Thread.



  • Number verwende ich garnich mehr. Ich habe ja eine Klasse in der ich im Konstruktor diesen Thread erzeuge. Das ist eine Methode die in der selben Klasse steht. Das funktioniert auch.

    Ich glaube das problem liegt im zugriff auf die Methode einer Klasse die im Thread zwar bekannt ist, da ich sie beim erzeugen als pointer übergeben habe, jedoch von mehrern Threads benutzt wird. Daher sollte ich die Methode irgendwie Thread sicher machen. Jetzt hatte ich schon nach Semaphoren geschaut. Leider finde ich nur Beispiele mit MFC, aber ich Programmiere ja mit der WinAPI. Weis nicht ob das so klasse ist wenn man immer zwischen den Bibliotheken hin und her springt. Bekomme ich das mit den Semaphoren auch in der WinAPI hin?

    Danke!



  • Mit dem geposteten Code übergibst Du an den Thread doch lediglich die Adresse der Variablen 'number'!?
    Die Thread-Funktion selbst ist offensichtlich eine statische Methode und hat damit zunächst mal auch nur Zugriff auf andere statische Methoden der Klasse, nicht aber auf nicht-statische Methoden eines bestimmten Objektes.


Log in to reply