/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
funktions pointer og klasser i c++
Fra : Kim Nielsen


Dato : 14-01-02 08:18

Hej NG

Jeg forsøger at lave en klasisk boss/worker model i c++ .. den virker
fint i c men når jeg begynder at konvertere den til c++ får jeg nogle
fejl som jeg ikke lige kan greje hvordan den bliver løst ..

Her er et snip af koden:

class model {
void *worker(void *);
void init();
public:
....
};

void model::init() {
....
for (int i=0;i<numofworkers;i++) {
pthread_create(&threads[i], 0, worker, 0);
}
}

void model::addwork(void (*function)(void *), void *args) {
.. smid i buffer
}

void *model::worker(void *) {
for (;;) {
....
lock
hent function + args fra liste til tmp
slet fra liste
unlock
function(args);
}
}

problemet ligger i pthread_create kaldet som modtager en void
*(*routine)(void *) .. men hvis man giver den funktionen funktionen void
*model::worker(void *) som argument brokker g++ sig over at den ikke er
en valid kandidat. Men derimod hvis jeg prøver med funktionen:

void *t(void *) {
}

virker det fint .. er der nogen der kan fortælle mig hvordan jeg får
pthread_create til at bruge den funktionen i klassen istedet ? .. jeg har
prøvet at caste den men det ser ikke ud til at det vil lykkes ..

håber nogen kan hjælpe

/Kim

 
 
Jonas Meyer Rasmusse~ (14-01-2002)
Kommentar
Fra : Jonas Meyer Rasmusse~


Dato : 14-01-02 10:13

Hejsa Kim
"Kim Nielsen" <knielsenSPAMFREE@proventum.net> wrote in message
news:a1u0jj$ptu$1@sunsite.dk...
> class model {
> void *worker(void *);
> void init();
> public:
> ....
> };
> void model::addwork(void (*function)(void *), void *args) {

Så vidt jeg kan forstå vil du her have en pointer til en member funktion.
Der er en lidt anderledes syntax når du skal have fat i dem, i dit tilfælde
vil argumentet hedde:

void*( model::*function)(void*)

Og husk, at når din funktion er ikke-statisk, skal du have en instans
af klassen.. hvis du tænker over det, så vil du også indse at det ikke giver
mening at kalde en member funktion uden at have en instans at kalde den på.

her er et eksempel:

#include <iostream>
class A
{
public:
void t()
{
std::cout << "..." << std::endl;
}
};

int main()
{
void(A::*func)() = &A::t;
A a;
((a).*(func))();

return 0;
}

mvh Jonas



Anders Melchiorsen (14-01-2002)
Kommentar
Fra : Anders Melchiorsen


Dato : 14-01-02 12:49

"Kim Nielsen" <knielsenSPAMFREE@proventum.net> wrote:

> en valid kandidat. Men derimod hvis jeg prøver med funktionen:
>
> void *t(void *) {
> }

Som Jonas siger, mangler du et objekt at køre din worker() funktion
med. Da du roder med et C bibliotek bliver du nok nødt til at lave en
C funktion, som "springer ind" i dit C++ program:

extern "C"
void* t(void* arg)
{
model* m = static_cast<model*>(arg);
m->worker();
}


Her overfører du en "this" pointer som "arg" til t(). Du kan så sige

pthread_create(&threads[i], 0, t, static_cast<void*>(&a_model));

hvor a_model er et model objekt. Jeg formoder, at du vil have et
sådant til hver tråd.


Anders.

PS. Hvis der findes en C++ udgave af pthreads var det måske et kig
værd? Men det ved jeg ikke, om der gør.

--
Gåsen gav et gæstebud
for grisene til jul.
Grisene fik gåsehud
da gåsen gav dem sul.

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste