2013-06-01 2 views
1

나는 추상 메소드 을 가지고 있는데, 이는 추상 메소드 인 run()을 가지고있다.Boost :: Thread에 추상 오버라이드 된 메소드 전달하기

void simModbusServer::start() {  
serverThread = boost::thread(&simModbusServer::run); 
} 

이 내가이 서브 클래스에 simModbusServer의 추상 메소드를 오버라이드 (override) run() 방법을 스레드를 만들 것이라고 가정하는 보정 오전 simModbusServer의 서브 클래스에서 호출 물론이다 : 그것은 또한이 방법이있다?

+0

가상 멤버가 아닌 함수에서도 작동하지 않습니다. [here] (http://stackoverflow.com/questions/16087463/pass-arguments-to-function-in-a-boostthread)를 참조하십시오. – juanchopanza

답변

2

아니, 당신은 run()이 멤버 함수이기 때문에, boost::bind를 사용해야하고, 그것을 암시 this 포인터를 받아 들인다 : 부스트의 최신 버전으로

#include <boost/bind.hpp> 

void simModbusServer::start() {  
    serverThread = boost::thread(
     boost::bind(&simModbusServer::run, this)); 
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
} 

을, 당신이 또한으로 직접 this을 전달할 수 있습니다 보인다 이 경우

void simModbusServer::start() {  
    serverThread = boost::thread(&simModbusServer::run, this); 
} 

, 당신을 아래 그림과 같이, (당신이 std::thread를 사용한다면 당신이 할 것 인 것이다) boost::thread의 생성자에 두 번째 인수 부스트는 필요 없어. 묶어.

+0

'boost :: bind'가 필요하다고 생각하지 않습니다. 질문에 대한 내 의견의 링크를 참조하십시오. – juanchopanza

+0

@juanchopanza : 두 번째 인수로'this'를 전달하면됩니까? 그게'std :: thread'로 할 것이지만 기억 된'boost :: thread'는 다르게 작동했습니다. 아마도 나는 단지 물건들을 혼란스럽게 생각하고있다. –

+0

나는 오래전에 그랬던 것처럼 생각한다. (그리고 어떤 시점에서, 나는 다른 사람들이 IIRC를 교정 할 때까지 똑같이 생각했다.) – juanchopanza

관련 문제