asio_wait에서 async_wait를 수행하고 유형 T에 대한 참조를 취하는 함수에 업데이트를 바인딩한다고 가정 해 봅시다. 먼저 스택에 async_wait를 전달하기 전에 T를 생성했다고 가정 해 봅시다. async_wait의 끝에서 async_wait 자체를 호출하여 타이머를 계속해서 갱신합니다. 그 스택은 T 타입을 할당 받았는지 타이머가 처음 갱신 될 때까지 살아남지 않습니까? 아니면 함수를 처음 호출 한 후에 T가 범위를 벗어날까요?언제 asio 타이머가 범위를 벗어 납니까?
5
A
답변
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를 호출 할 때마다 공유 포인터를 전달하여 바인더를 힙에서 관리 할 수 있습니다. 이는 다음과 같이 보일 수 있습니다.
관련 문제
- 1. 왜 개체의 값을 변경하면 viewWillDisappear에서 내 개체가 범위를 벗어 납니까?
- 2. LinqToXML 왜 개체가 범위를 벗어 납니까? 또한 그룹별로해야합니까?
- 3. ARM9 SVC_STACK 범위를 벗어 났습니까?
- 4. 왜 내 속성이 범위를 벗어 났습니까?
- 5. ColdFusion에서 "문자열 색인이 범위를 벗어"argumentcollection
- 6. 다른 객체의 생성자에 인수로 전달 된 C++ 객체는 어떤 순서로 범위를 벗어 납니까?
- 7. Xcode 4 "수정"- 언제 나타 납니까?
- 8. Silverlight 3 : 이벤트 트리거가 특성이 범위를 벗어 났음을 나타냅니다.
- 9. varchar 데이터 형식에서 datetime 데이터 형식으로 인해 범위를 벗어 났습니까?
- 10. 연관 확장과 명명 된 범위를 언제 사용합니까?
- 11. 반복되는 소프트웨어 타이머가 이전 타임 아웃과 관련하여 언제 실행되어야합니까?
- 12. boost :: asio 언제 async_write 대신 free :: async_send를 사용해야합니까?
- 13. 내부 및/또는 부분 수업은 주립 디자인 패턴의 원칙을 벗어 납니까?
- 14. Asp.net에서 타이머가 다시 발생
- 15. 타이머가 파이썬
- 16. C++ Boost ASIO 간단한주기 타이머?
- 17. 왜이 코드가 루프를 벗어 났습니까?
- 18. 자바에서 루프 논리를 벗어 버려야합니다.
- 19. Silverlight가 샌드 박스에서 벗어 났습니까?
- 20. nsstring - 범위를 벗어남
- 21. 문자열 인덱스가 범위를 벗어 났습니까? (자바, 문자열 루프) 나는 COSC 과정에 대한 만들고있어이 프로그램은 바로 컴파일되지
- 22. 범위를 벗어 났지만 여전히 참조를 보유하고있을 때 Java GC에 어떤 현상이 있습니까?
- 23. C++ 타이머가 작동하지 않습니까?
- 24. 타이머가 서버 측에 있습니까?
- 25. 스레드 안전 타이머가 있습니까?
- 26. 타이머가 한 번만 작동합니다.
- 27. Java 타이머가 작동하지 않습니다.
- 28. 타이머가 멈추는 이유는 무엇입니까?
- 29. 카운트 다운 타이머가 #
- 30. C# 타이머가 틱하지 않습니다
실제 코드를 입력하십시오. :) – vladr
async_wait() 사용 방법을 더 잘 설명 할 수 있다면 좋을 것입니다. 어쩌면 어떤 코드 또는 메타 코드에 의해. 당신은 아마도 small_ducks 답안에서와 같이 할 필요가 있으며, 새로운 함수를 다른 함수에 전달하고 원하는 결과를 얻으려면 타이머를 생성해야합니다. – jpyllman