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:
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
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;
}
[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.
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.
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();
}
[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.
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.