Hozzászólások
[quote:1f91a26eb4="algernon"][quote:1f91a26eb4="vik1984"][quote:1f91a26eb4="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)
egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.
Udv,
compi
Huh, thx, ez szép és jó, de...
Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?
Nem lenne egyszerubb, ha a pthread_create() kapna egy sima C fuggvenyt, valamint annak argumentumakent (pthread_create utolso parametere), egy pointert egy objektumra? Es akkor a sima C fuggveny fogna es az objektum megfelelo metodusat meghivna? Magyarul csinalsz egy gonosz kis indirekciot, es akkor nem kell szenvedni egyeb workaroundokkal.
Valszeg ugy lesz, hogy egy C fuggvenyt kuld threadbe, majd az meghivja az objektum megfelelo metodusat. Csak gondoltam, hatha direktbe is menne-e. Azert koszonom a valaszokat, a problemat mar megoldtam.
- A hozzászóláshoz be kell jelentkezni
[quote:99c7d869c2="compi"][quote:99c7d869c2="vik1984"][quote:99c7d869c2="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)
egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.
Udv,
compi
Huh, thx, ez szép és jó, de...
Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?
class threadedobject
{
public:
static void thread_dispatch( void *arg );
void real_thread();
};
int main( int argc, char **argv )
{
threadedobject to;
thread_t thread_id;
int err = pthread_create( &thread_id, NULL, &threadedobject::thread_dispatch, &to);
}
void threadedobject::thread_dispatch( void *arg )
{
threadedobject *to=(threadedobject*)arg;
arg->real_thread();
}
Oszinten megvallva ezt csak ide vertem be, meg se probaltam leforditani, meg az is lehet hogy le se fordul, de az elv szerintem jol latszik belole.
Hat persze hogy nem fordul le. itt van ami lefordul:
#include <pthread.h>
#include <unistd.h>
class threaded
{
public:
static void* thread_dispatch( void *arg );
void real_thread();
};
int main( int argc, char **argv )
{
threaded to;
pthread_t threadid;
pthread_create(&threadid, NULL, &threaded::thread_dispatch, &to);
sleep(10);
}
void* threaded::thread_dispatch( void * arg )
{
threaded *to = (threaded*)arg;
to->real_thread();
return NULL;
}
void threaded::real_thread()
{
}
- A hozzászóláshoz be kell jelentkezni
Van egy kis problémám, mégpedig hogy nem tudom egy C++-os objektummetódus címét lekérdezni.
Teszem azt, legyen az adott objektum:
[code:1:107710d06f]class Valami {
public:
virtual void *fuggveny(void *) {
...
}
} peldany;[/code:1:107710d06f]
A gond az, hogy ha pl &(peldany.fuggveny) -t irok, azt a g++ nem szereti, ennek hangot is ad:
[code:1:107710d06f]test.cc:36: error: ISO C++ forbids taking the address of a bound member
function to form a pointer to member function. Say `&Valami::fuggveny'[/code:1:107710d06f]
A gond az, hogy nekem mindenképpen az adott példány címe kellene, nem pedig egy megadott objektum megadott metódusának a címe. Ez azért van, hogy pl. egy adott függvény indítsa el a példányhoz tartozó fuggveny nevű függvényt.
A válaszokat előre is köszönöm.
- A hozzászóláshoz be kell jelentkezni
[quote:04766fb2e1="vik1984"]Van egy kis problémám, mégpedig hogy nem tudom egy C++-os objektummetódus címét lekérdezni.
Teszem azt, legyen az adott objektum:
[code:1:04766fb2e1]class Valami {
public:
virtual void *fuggveny(void *) {
...
}
} peldany;[/code:1:04766fb2e1]
A gond az, hogy ha pl &(peldany.fuggveny) -t irok, azt a g++ nem szereti, ennek hangot is ad:
[code:1:04766fb2e1]test.cc:36: error: ISO C++ forbids taking the address of a bound member
function to form a pointer to member function. Say `&Valami::fuggveny'[/code:1:04766fb2e1]
A gond az, hogy nekem mindenképpen az adott példány címe kellene, nem pedig egy megadott objektum megadott metódusának a címe. Ez azért van, hogy pl. egy adott függvény indítsa el a példányhoz tartozó fuggveny nevű függvényt.
A válaszokat előre is köszönöm.
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)
egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.
Udv,
compi
- A hozzászóláshoz be kell jelentkezni
[quote:465826aac2="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)
egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.
Udv,
compi
Huh, thx, ez szép és jó, de...
Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?
- A hozzászóláshoz be kell jelentkezni
[quote:82ca755add="vik1984"][quote:82ca755add="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)
egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.
Udv,
compi
Huh, thx, ez szép és jó, de...
Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?
Nem lenne egyszerubb, ha a pthread_create() kapna egy sima C fuggvenyt, valamint annak argumentumakent (pthread_create utolso parametere), egy pointert egy objektumra? Es akkor a sima C fuggveny fogna es az objektum megfelelo metodusat meghivna? Magyarul csinalsz egy gonosz kis indirekciot, es akkor nem kell szenvedni egyeb workaroundokkal.
- A hozzászóláshoz be kell jelentkezni
[quote:fe82688881="vik1984"][quote:fe82688881="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)
egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.
Udv,
compi
Huh, thx, ez szép és jó, de...
Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?
class threadedobject
{
public:
static void thread_dispatch( void *arg );
void real_thread();
};
int main( int argc, char **argv )
{
threadedobject to;
thread_t thread_id;
int err = pthread_create( &thread_id, NULL, &threadedobject::thread_dispatch, &to);
}
void threadedobject::thread_dispatch( void *arg )
{
threadedobject *to=(threadedobject*)arg;
arg->real_thread();
}
Oszinten megvallva ezt csak ide vertem be, meg se probaltam leforditani, meg az is lehet hogy le se fordul, de az elv szerintem jol latszik belole.
- A hozzászóláshoz be kell jelentkezni