PDA

View Full Version : [c++] eseguire un metodo in un thread


Ricky
17-01-2009, 19:24
Ciao a tutti, vorrei eseguire un metodo in un thread differente. Mi spiego:

class SomeClass{

public:

void metodoThread();
void avviaThread();
}

void SomeClass::metodoThread(){
//do something
//may be calling other methods (with mutex ect ect)
}
void SomeClass::avviaThread(){

thread = funzionechestocercando(metodoThread);

}


ho provato con i pthread... ma mi da casini. Sono riuscito a far partire un metodo statico, ma poi da questo metodo non riesco a chiamare altri metodi...

qualcuno ha fatto qualcosa del genere?
sto provando a vedere un pò le api di Boost ma senza grandi risultati...

grazie anticipate!

cionci
17-01-2009, 20:35
Con i pthread puoi far partire un metodo statico, però passando come parametro al metodo statico (il 4° argomento di pthread_create è l'argomento che viene passato al metodo statico sotto forma di void *) il puntatore ad un'istanza della classe, allora puoi far eseguire qualsiasi metodo della classe.

Ad esempio:

class AbstractThread
{


public:
virtual void * run() = 0;

static void runner(void * concreteThreadInstance)
{
pthread_exit(((AbstractThread *)concreteThreadInstance)->run());
}
};

class MyThread: public AbstractThread
{
public:
MyThread();

virtual void * run()
{
doSomething();
return NULL;
}
};

MyThread myThread;
int ret = pthread_create(pthread, NULL, AbstractThread::runner, (void *)myThread);

Ricky
17-01-2009, 21:34
gentilissimo! grazie.

Posso avviare nel costruttore un thread che in realtà è un metodo?.....la vedo un pò sporchina....però vorrei poter accedere ad altri metodi della classe stessa e fare una sorta di trigger, sempre tutto sincronizzato ect...come la vedi?

cionci
17-01-2009, 21:54
Sinceramente nel costruttore la cosa la vedo un po' male...in un altro metodo puoi farlo sicuramente ed è anche un'ottima organizzazione per un thread.

class AbstractThread
{
virtual void * run() = 0;

public:
static void runner(void * concreteThreadInstance)
{
pthread_exit(((AbstractThread *)concreteThreadInstance)->run());
}

virtual void start()
{
//qui richiami la pthread_create passando this come argomento
}
};

class MyThread: public AbstractThread
{
virtual void * run()
{
doSomething();
return NULL;
}

public:
MyThread();
};

cionci
18-01-2009, 01:34
Avevo fatto un errore nel posizionare start ;)

Ricky
19-01-2009, 21:41
grazie grazie grazie!
sei stato veramente gentilissimo. Alla prossima!!

Ricky
27-01-2009, 02:09
per tutti quelli che volessere utilizzare queste info c'è un picolissimo errore che cmq non sminuisce il grandissimo aiuto..;)

static void runner(void * concreteThreadInstance)
=>
static void *runner(void * concreteThreadInstance)


saluti e grazie di nuovo

cionci
27-01-2009, 11:34
Giusto ;)