[C++ OO][Thread] Wskaźnik na metodę innej klasie

0

Witam
Mam problem z podaniem wskaźnika metody innej klasy.

#include <windows.h>

class A
{
   public:
      DWORD WINAPI wskaznikProcedury (LPVOID arg)
      {
         //treść
         return 0;
      }
}
// ---
class B
{
   public:
      A *test;
      HANDLE uchwytWatku;

      //LPTHREAD_START_ROUTINE wpw - wskaznik do procedury watku
      //LPVOID lpv - argument przesylany do procedury
      HANDLE nowyWatek(LPTHREAD_START_ROUTINE wpw, LPVOID lpv)
      {
         return CreateThread (NULL, 0, test->*wskaznikProcedury, lpv, 0, NULL);
      }
}

Przedstawiłem bardzo uproszczony kod, ponieważ w swoim kodzie już bardzo namieszałem.
próbowałem różnych sposobów, ale większość przykładów przedstawiało jak uruchomić taką
metodę, w tym przypadku muszę przekazać tylko wskaźnik na nią.

Jednym z przykładów było stworzenie struktury zawierającej wskaźnik do obiektu i
następnie wskaźnik do metody, ale pobranie tego wskaźnika też nie działało :-/

Głównie robiłem na podstawie tego: http://xion.org.pl/files/texts/mgt/html/2_2.html
Nie zamieściłem swojego kodu, nawet z próbami, ponieważ jak pisałem wyżej, kombinowałem różnie,
że sam juz nie wiem co w tym kodzie jest. Dlatego też proszę o pomoc i chcę od nowa zacząć
walkę z tym zagadnieniem.

Z góry dzięki za wszelką pomoc. :)

0
#include <windows.h>

class A
{
   public:
      static DWORD WINAPI wskaznikProcedury(LPVOID arg)
      {
         //treść
         return 0;
      }
};
// ---
class B
{
   public:
      A *test;
      HANDLE uchwytWatku;

      //LPTHREAD_START_ROUTINE wpw - wskaznik do procedury watku
      //LPVOID lpv - argument przesylany do procedury
      HANDLE nowyWatek(LPTHREAD_START_ROUTINE wpw, LPVOID lpv)
      {
		  return CreateThread (NULL, 0, &A::wskaznikProcedury, lpv, 0, NULL);
      }
};

0

o jej !!
Działa i nie spodziewałem się, że dostanę tak szybko odpowiedź.
Okazało się to takie proste a kombinowałem z jakimiś dodatkowymi strukturami.

Dziękuję :)

0

Pzepraszam, że umieszczam post pod postem..

Sprawdziłem na szybkiego i działa wszystko dobrze.
Ale właśnie też zależało mi na tym, żeby metody te nie były statyczne.

Jeśli nie ma na to odpowiedzi.. będzie trzeba inaczej wszystko zorganizować wszystko :(

Dzieki.. :)

0

zerknij do "szukaj" za thread niestatyczny, znajdziesz obszerne wyjasnienia co i czemu jest jak jest..

ogolnie rzecz biorac, funkcja watku MUSI byc statyczna, poniewaz createthread potrzebuje PROSTY wskaznik na funkcje. ale mozesz to sprytnie zamarkowac, aby "przekierowac" program potem na niestatyczna wersje:

struct MojaKlasa
{
    static void statyczna(void* arg){ ((MojaKlasa*)arg)->niestatyczna(); }

    void niestatyczna() { this->x = 5; }

    int x;
}
//i teraz, gdzies-tam mozesz:
MojaKlasa* jakaszmienna = .....; //stworz sobie jakos gdzies obiekt, wez sobie wskaznik do niego
CreateThread (NULL, 0, &A::statyczna, (void*)jakaszmienna, 0, NULL);

oczywisice musisz przypilnowac aby obiekt zyl przynajmniej tak dlugo jak watek.
jesli chcesz jeszcze miec parametry w niestatyczne metodzie, zamiast jakaszmienna bedziesz musial watkowi podac parametry+wskazniknaobiekt w jakiejs strukturze etc.

albo idz po boost::thread/boost::bind itp..

1 użytkowników online, w tym zalogowanych: 0, gości: 1