View Full Version : [c++] eseguire un metodo in un thread
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!
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);
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?
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();
};
Avevo fatto un errore nel posizionare start ;)
grazie grazie grazie!
sei stato veramente gentilissimo. Alla prossima!!
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.