2010-03-13 4 views
5

asio_wait에서 async_wait를 수행하고 유형 T에 대한 참조를 취하는 함수에 업데이트를 바인딩한다고 가정 해 봅시다. 먼저 스택에 async_wait를 전달하기 전에 T를 생성했다고 가정 해 봅시다. async_wait의 끝에서 async_wait 자체를 호출하여 타이머를 계속해서 갱신합니다. 그 스택은 T 타입을 할당 받았는지 타이머가 처음 갱신 될 때까지 살아남지 않습니까? 아니면 함수를 처음 호출 한 후에 T가 범위를 벗어날까요?언제 asio 타이머가 범위를 벗어 납니까?

+0

실제 코드를 입력하십시오. :) – vladr

+0

async_wait() 사용 방법을 더 잘 설명 할 수 있다면 좋을 것입니다. 어쩌면 어떤 코드 또는 메타 코드에 의해. 당신은 아마도 small_ducks 답안에서와 같이 할 필요가 있으며, 새로운 함수를 다른 함수에 전달하고 원하는 결과를 얻으려면 타이머를 생성해야합니다. – jpyllman

답변

0

저는 asio 타이머에 대한 경험이 없습니다. 하지만 그렇게한다면

void somefunc(void) 
{ 
    boost::asio::io_service io; 

    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
} 

그런 다음 타이머가 기능을 종료하면 범위를 벗어납니다. 따라서이 코드를 사용하면 아무런 대기가 발생하지 않습니다. 해당 코드에 t.wait()를 추가하면 5 초 후에 함수를 종료하고 타이머가 범위를 벗어납니다.

void somefunc(void) 
{ 
    boost::asio::io_service io; 

    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(somecallback); 

    io.run(); 
} 

두 번째 예제에서 함수가 종료되면 타이머가 범위를 벗어납니다.

타이머를 돌아 다니고 싶다면 이렇게 작성해야합니다.

void somefunc(void) 
{ 
    boost::asio::io_service io; 

    while(something) 
    { 
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(somecallback); 

    io.run(); 
    } 
} 

이렇게하면 타이머가 루프에서 한 턴 동안 스택에 유지 된 다음 다시 작성됩니다. 루프 외부에 타이머를두면 범위를 벗어날 수 없습니다. 그렇다면 루프를 돌리는 방법으로 다시 설정해야합니다. 그러나 나는 그러한 기능을 보지 못했다.

EDIT : async_wait()의 예에서 io.run()이 대기 상태가되지 않으면 타이머가 종료되지 않고 직접 범위를 벗어나 파괴됩니다. 그리고 나는 deadline_timer()의 desructor가 소멸자를 때릴 때 타이머를 취소 할 것이라고 추측합니다.

8

스택에 타이머를 작성한 다음 async_wait를 호출하면 함수 호출이 끝날 때 타이머가 파괴되고 콜백이 적절한 오류 매개 변수로 즉시 호출됩니다.

개체가 복사 할 수 없으므로 boost :: bind를 사용하여 타이머 개체를 콜백에 전달할 수 없습니다.

그러나 async_wait를 호출 할 때마다 공유 포인터를 전달하여 바인더를 힙에서 관리 할 수 ​​있습니다. 이는 다음과 같이 보일 수 있습니다.

관련 문제