(C++) Problemas com referencia

Bom dia galera, estou com problemas de referencia de metodo que eu nao sei mais oq fazer.

Classe.h

[code]class Classe {
private:
unsigned int a;

public:
Classe();
virtual ~Classe();
void start();
void stop();
void thMethod();
virtual void rotina() =0;
};[/code]

Classe.cpp

#include "Classe.h"
Classe::Classe() {
        boost::thread th(thMethod); //essa linha
}

Classe::~Classe() {}

void Classe::thMethod() {
       rotina();
}

porem a linha marcada lança o seguinte erro:
no matching function for call to ?boost::thread::thread( )?

eu nao sei mais oq fazer, alguem sabe como eu posso fazer isso?!
muito obrigado.

[]s

Tio, não há nenhum construtor de boost::thread que receba um nome de método. Absolutamente nenhum. Portanto, é para dar essa mensagem de erro mesmo.

http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread

Você não leu o tutorial? Ele está em

http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html

Veja o exemplo “Launching threads”.

Outra coisa, quando o construtor de “boost::thread” com parâmetros é chamado, a thread já é iniciada; ou seja, se você quiser ter um membro de uma classe que é um boost::thread, você pode fazer alguma das seguintes coisas:

a) Usar o construtor vazio - nesse caso, você deve associar à thread um objeto do tipo “callable” na hora de iniciar a thread,
ou
b) Usar um shared_ptr para uma thread, e chamar “new thread” na hora de iniciar a thread.

Tem sim,
quando eu crio um metodo sem ser na classe .h, ou seja, somente crio o metodo no cpp e passo esse metodo para o construtor de thread, ele executa o metodo como se fosse o run.
eu uso isso em outra classe minha.

porem eu nao posso fazer isso pois esse meu metodo precisa acessar outro metodo abstrato, no caso o metodo rotina

— editado
isso é mostrado no proprio link q vc me mandou:

void find_the_question(int the_answer);

boost::thread deep_thought_2(find_the_question,42);

O seu problema é que você precisa chamar um método da própria classe como uma thread. Isso não é possível exatamente desse jeito que você quer, mas de uma outra maneira - vou dar um exemplo daqui a pouco.

[quote=entanglement]O seu problema é que você precisa chamar um método da própria classe como uma thread. Isso não é possível exatamente desse jeito que você quer, mas de uma outra maneira - vou dar um exemplo daqui a pouco.
[/quote]

blz, se vc puder msm, eu agradeceria, pq to loco com isso jah :confused:

#include <iostream>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
using namespace std;


class ExemploBoostThread {
public:
   ExemploBoostThread();
   void teste();
private:
   void funcThread1();
   boost::shared_ptr<boost::thread> thread1;
   int x;
   void printX () { cout << "x = " << x << endl; }
};

void ExemploBoostThread::funcThread1 ()
{
    x = 42;     
}

ExemploBoostThread::ExemploBoostThread() {
    x = 0;
}

void ExemploBoostThread::teste() {
    printX();
    thread1.reset (new boost::thread (boost::bind (&ExemploBoostThread::funcThread1, this)));
    thread1->join();
    printX();
}

int main (int argc, char *argv[]) {
    ExemploBoostThread ebt;
    ebt.teste();
}
  1. Para você iniciar uma thread exatamente no lugar que você quer (não no construtor), você pode usar um shared_ptr, como fiz acima.
  2. Para você criar um “callable” adequado para chamar um método de sua própria classe, use boost::bind, como fiz acima.

O resultado é:

x = 0
x = 42

Simples, não?

[quote=entanglement]O resultado é:

x = 0
x = 42

Simples, não?[/quote]

acho que eu consegui entender, vo tentar implementar e jah digo o resultado, valeu mesmo…
agora outra duvida, vc fez ai o que seria o .h e o .cpp tudo junto, o que eh melhor fazer, tudo junto assim, ou separados, .h e .cpp?!

grato.

---- editado

[quote=entanglement][code]
#include
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
using namespace std;

class ExemploBoostThread {
public:
ExemploBoostThread();
void teste();
private:
void funcThread1();
boost::shared_ptrboost::thread thread1;
int x;
void printX () { cout << "x = " << x << endl; }
};

void ExemploBoostThread::funcThread1 ()
{
x = 42;
}

ExemploBoostThread::ExemploBoostThread() {
x = 0;
}

void ExemploBoostThread::teste() {
printX();
thread1.reset (new boost::thread (boost::bind (&ExemploBoostThread::funcThread1, this)));
thread1->join();
printX();
}

int main (int argc, char *argv[]) {
ExemploBoostThread ebt;
ebt.teste();
}
[/code]

  1. Para você iniciar uma thread exatamente no lugar que você quer (não no construtor), você pode usar um shared_ptr, como fiz acima.
  2. Para você criar um “callable” adequado para chamar um método de sua própria classe, use boost::bind, como fiz acima.

[/quote]

funcionou perfeitamente,
valeu mesmo, porem outra coisa,

e no caso de multithread, o join nao poderia ser usado, como eu faria entao?!

[quote=Sad7]acho que eu consegui entender, vo tentar implementar e jah digo o resultado, valeu mesmo…
agora outra duvida, vc fez ai o que seria o .h e o .cpp tudo junto, o que eh melhor fazer, tudo junto assim, ou separados, .h e .cpp?![/quote]

É melhor fazer separado. Ele provavelmente deixou tudo junto pq fica mais fácil postar no fórum.

  1. Pode separar em .cpp e .hpp, não tem problema nenhum. (É questão de gosto, mas prefiro usar .hpp em vez de .h para lembrar que é código C++, não C puro.). Só postei dessa maneira para facilitar - e porque sou preguiçoso mesmo. Em um programa grande, iria separar tudo direitinho.
    Na verdade, quando a implementação de uma classe fica muito grande (do tipo “puxa vida, escrevi um .cpp com 10.000 linhas e fica difícil até de me achar lá dentro”) eu costumo escrever um .hpp e vários .cpp para a mesma classe.
    É claro que tudo depende do seu projeto.

  2. Eu usei o “join” só para ficar fácil de mostrar um exemplo para você.

Outra coisa legal do bind. Digamos que você queira passar parâmetros para o método que é também uma thread (e que esses parâmetros não sejam do tipo “Tipo&” - é um problema do C++ não conseguir passar esse tipo no bind, não sei se o C++0X conseguirá resolver isso.)

Vou modificar o exemplo para ver o que pode ser feito:

#include <iostream>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
using namespace std;


class ExemploBoostThread {
public:
   ExemploBoostThread();
   void teste();
private:
   void funcThread1(int);
   boost::shared_ptr<boost::thread> thread1;
   int x;
   void printX () { cout << "x = " << x << endl; }
};

void ExemploBoostThread::funcThread1 (int y)
{
    x += y;     
}

ExemploBoostThread::ExemploBoostThread() {
    x = 0;
}

void ExemploBoostThread::teste() {
    printX();
    thread1.reset (new boost::thread (boost::bind (&ExemploBoostThread::funcThread1, this, 

20)));
    thread1->join();
    printX();
}

int main (int argc, char *argv[]) {
    ExemploBoostThread ebt;
    ebt.teste();
}

A saída esperada é:

x = 0
x = 20

[quote=entanglement]1) Pode separar em .cpp e .hpp, não tem problema nenhum. (É questão de gosto, mas prefiro usar .hpp em vez de .h para lembrar que é código C++, não C puro.). Só postei dessa maneira para facilitar - e porque sou preguiçoso mesmo. Em um programa grande, iria separar tudo direitinho.
Na verdade, quando a implementação de uma classe fica muito grande (do tipo “puxa vida, escrevi um .cpp com 10.000 linhas e fica difícil até de me achar lá dentro”) eu costumo escrever um .hpp e vários .cpp para a mesma classe.
É claro que tudo depende do seu projeto.

  1. Eu usei o “join” só para ficar fácil de mostrar um exemplo para você. [/quote]

entendi a explicação…

mais se eu tirar o join, o programa vai fechar…pq meu main soh tem um start(), que inicia a thread, porem nao posso ficar esperando ela acabar pois posso iniciar outras threads.

=//