2017-12-10 21 views
0

내 질문은 다음 질문과 정확하게 공감했습니다.일정 시간 후에 기능을 해제하십시오. (C++)

break the function after certain time

그러나, 위의 문제는 파이썬 구현을 중심으로 돌아 가지. C++에서 같은 것을 구현하려고합니다.

#include <signal.h> 
#include <stdio.h> 
#include <stdbool.h> 
#include <unistd.h> 
#include <stdexcept> 

void handle_alarm(int sig) { 
    printf("%d",sig); 
    throw std::invalid_argument("none"); 
} 

int main() { 

    for (int i=0; i<10; i++){ 
     signal(SIGALRM, handle_alarm); 
     printf("Doing normal work %d \n",i); 
     alarm(120); 

     try { 
      for (;;){} // It will be replaced by a function which can take very long time to evaluate. 
     } 
     catch(std::invalid_argument& e) { 
     continue; 
     } 
    } 
} 

문제 문

: 다음 코드는 평가에 시간이 오래 걸릴 수 회 반복 될 때마다, 함수 XYZ, 더불어, 대체 (호출 될 위의 코드에서 무한 루프). 내 목표는 2 분 이상 걸릴 경우 함수의 실행을 종료하고 다음 반복을 계속하는 것입니다.

그러나이 경우 오류 terminate called after throwing an instance of 'std::invalid_argument'이 표시됩니다. 또한 맞춤 예외 클래스를 사용하려고했지만 오류가 지속됩니다.

이 구현과 관련하여 잘못된 점을 파악할 수 없습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+0

신호 처리기에서 Throwing이 잘못되었습니다. 시그널 핸들러에서 매우 진보 된 것을해서는 안되며, 궁극적으로는 플래그를 설정해야한다. –

+0

당신이 찾고있는 것은 "코 루틴 (Coroutines)"입니다. C++에 포함되어 있는지는 확실하지 않지만 C#과 Unity3D에서는 그렇게 할 수 있습니다. – Brandon

+0

@Brandon "Coroutines"는 기회가있는 것 같습니다. 그러나, 당신은이 문맥에서 그들을 논의하는 어떤 참고 문헌도 제공 할 수 있습니까? – Virange

답변

1

문제를 해결하는 한 가지 방법은 을 asynclaunch policy과 함께 사용하는 것입니다.

그런 다음 wait_for이 반환 된 std::future을 사용하여 결과의 ​​특정 시간 만 대기 할 수 있습니다.

시간 프레임 내에 결과를 얻지 못하면 미래를 저장합니다 (결과가 나올 때까지 destructed 일 수는 없습니다).하지만 그 결과와 가능한 결과는 무시하십시오.

이것은 실제로 함수를 "중단"하지 않으며, 완료 될 때까지 계속됩니다. 하지만 어쨌든 프로그램을 계속 진행하는 방법입니다.


또 다른 가능한 솔루션은 계속하거나하지 말아야 알고 threads를 사용하고 그것에서 지속적으로 타임 아웃을 확인, 또는 (atomic) 플래그에 대한 것입니다.

+0

wait_for는 좋은 옵션이지만 내 작업에는 적합하지 않습니다. 나는 1000 초의 반복을 가지며 각각 하나가 종료되지 않으면 대기 시간이 길어질 것입니다. – Virange