[C++ WinAPI] Funkcja składowa klasy jako parametr innej fun

0

Witam!

Mam problem z CreateThread. Gdy jako funkcję do uruchomienia w osobnym procesie podaje zwykłą funkcję globalną tak:

CreateThread(NULL, 0, FUNKCJA, PARAMETR, 0, &gThreadID);

To jest wszystko w porządku. Chcę jednak przekazać funkcję należącą do klasy KLASA1 do której wskaźnik jest obiektem w innej dynamicznie utworzonej klasie KLASA2 i robię to tak:

CreateThread(NULL, 0, KLASA2->KLASA1->FUNKCJA, PARAMETR, 0, &gThreadID);

I wyskakuje:
Member function must be called or its address taken

CreateThread(NULL, 0, <b>&</b>KLASA2->KLASA1->FUNKCJA, PARAMETR, 0, &gThreadID);

I wyskakuje:
Use :: to take the address of a member function

i inne kombinacje też nic nie dają.

Jak więc wskazać tu adres funkcji???

0

daj ja static, poszukaj bo bylo o tym na forum

0

No ale jak nie chce STATIC? Funkcja statyczna może operować tylko na statycznych składnikach klasy, tak?

0

tak, tylko na statycznych, jak Ci nie pasuje to przekazuj wskaznik do obiektu

0

??
Jaki wskaźnik? Klasę jako parametr? Ja chcę wywołać funkcję należącą do klasy aby właśnie wygodnie operować jej składnikami bez konieczności uzywania

Klasa2->Klasa1->Składnik

Nie ma więc sposobu na wskazanie adresu tej funkcji?

0

Troche mam dzis problemy z mysleniem ale zrozumialem to tak, ze dla danego obiektu chcesz tworzyc watek na podstawie jego metody. Jesli tak, to zrob sobie metode statyczna (dla CreateThread) i przekazuj do niej wskaznik do obiektu, ktorego ma dotyczyc, a dopiero z tej funkcji wywoluj metode odpowiedniego obiektu.

0

mozna tez przekazać wskaźnik na metode tej klasy.

0
spony napisał(a)

mozna tez przekazać wskaźnik na metode tej klasy.

Nie sądze ;)

0

foflik:

Jesli tak, to zrob sobie metode statyczna (dla CreateThread) i przekazuj do niej wskaznik do obiektu, ktorego ma dotyczyc, a dopiero z tej funkcji wywoluj metode odpowiedniego obiektu.

I muszę używać Klasa->FUNKCJA co nie ułatwia mi nic :)

No i że nie da się uruchomić funkcji nie-statycznej z klasy, robię to funkcją spoza klasy.

Dzięki za rady!

0

Hmm.. a może jeszcze spróbuje zaprzyjaźnioną funkcję do klasy.

A po co takie zabiegi jeżeli i tak na jedno wyjdzie???

0

Wiem, dlatego to usunąłem :)

0

Najprostszy sposób(zresztą wspomniany)

class Klasa
{
public:
   DWORD ThreadFunc(){ MessageBox(NULL, "KLASA!!!", "", 0); };
   static DWORD WINAPI ThreadProc(Klasa* klasa) { return klasa->ThreadFunc(); };

...

Klasa klasa;
DWORD ThreadId;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Klasa::ThreadProc, &klasa, 0, &ThreadId);

Jak ci on w czymś przeszkadza, to może problem da sie rozwiązać jakoś inaczej.

0

adf88: ale muszę mieć wszystkie składniki w klasie STATYCZNE - a nie chcę :)
Chciałem to zrobić tylko dlatego aby nie operować KLASA1->KLASA2->OBIEKT. Ale jeśli jest warunek - STATYCZNE.. to zrobię to normalną funkcją.

No chyba, że jest sposób, to poszerzę wiedzę z chęcią :)

0

adf88: ale muszę mieć wszystkie składniki w klasie STATYCZNE - a nie chcę

Nie musisz ;) Statyczną masz jedynie ThreadProc, a ta wywołuje ThreadFunc gdzie masz normalny dostęp do składowych.

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