2013-04-11 3 views
2

after 부분은 내 프로그램이지만 예상대로 작동하지 않습니다. 나는 메인 윈도우 프로그램 호출 함수 "MyDllIniSys"를 dll에두고 dll은 메인 윈도우 프로그램이 "bIAutoRender"를 1로 설정하지 않을 때까지 32 마이크로 초당 윈도우를 렌더링하게한다. 그래서 함수 "MyDllIniSys"가 스레드를 시작하기를 바란다. , 한 번에 돌아 오십시오. 하지만 내가 한 일에 프로그램이 작동하지 않습니다. 스레드가 시작되면 결코 되돌아 오지 않습니다. 나는 그것을 얻을 수있는 방법, 누군가 pls. 도움. thread1 실행이 완료 될 때까지 많은 감사어떻게 백그라운드에서 dll에서 muti boost 스레드를 사용할 수 있습니까?

static void renderOneFrame(const boost::system::error_code& /*e*/, 
    boost::asio::deadline_timer* t, int* iNeedAutoRender) 
{ 


    //call Who use this DLL, let it refresh the window 
    if(OnRefreshEvent) 
    { 
     OnRefreshEvent(); 
    } 

    if(*iNeedAutoRender == 1) 
    { 
     t->expires_at(t->expires_at() + boost::posix_time::microseconds(iIRenderMicroSenconds)); 
     t->async_wait(boost::bind(renderOneFrame, 
       boost::asio::placeholders::error, t, iNeedAutoRender)); 
    } 

} 

EXTERN_C MYDLLAPI INT MyDllIniSys(INT WindowWidth,INT WindowHeight) 
{ 
    COgreRenderLoader myLoader; 
    myLoader.IniOgre(externalWindowHandle,WindowWidth,WindowHeight); 

    boost::asio::io_service io; 
    boost::asio::deadline_timer t(io, boost::posix_time::microseconds(iIRenderMicroSenconds)); 

    t.async_wait(boost::bind(renderOneFrame, 
      boost::asio::placeholders::error, &t,&bIAutoRender)); 

    boost::thread thread1(boost::bind(&boost::asio::io_service::run, &io)); 
    //io.run(); 
    thread1.join(); 
    //thread1.start_thread(); 

    return 1; 
} 

답변

0

(thread1.join 호출)를 차단합니다. 그만두면 함수가 스레드를 시작하고 즉시 리턴합니다.

thread1 개체가 범위를 벗어나더라도 스레드는 계속됩니다 (as you can see from this question).

관련 문제