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.
Sad7
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.
Sad7
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.
blz, se vc puder msm, eu agradeceria, pq to loco com isso jah
Para você iniciar uma thread exatamente no lugar que você quer (não no construtor), você pode usar um shared_ptr, como fiz acima.
Para você criar um “callable” adequado para chamar um método de sua própria classe, use boost::bind, como fiz acima.
E
entanglement
O resultado é:
x = 0
x = 42
Simples, não?
Sad7
entanglement:
O resultado é:
x = 0
x = 42
Simples, não?
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?!
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.
funcionou perfeitamente,
valeu mesmo, porem outra coisa,
e no caso de multithread, o join nao poderia ser usado, como eu faria entao?!
ViniGodoy
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?!
É melhor fazer separado. Ele provavelmente deixou tudo junto pq fica mais fácil postar no fórum.
E
entanglement
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ê.
E
entanglement
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:
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ê.
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.