2017-12-10 12 views
0

私の質問は、次の質問と正確に共鳴しました。一定時間後に機能を解除してください。 (C++)

break the function after certain time

しかし、上記の質問には、Pythonの実装を中心に展開。私は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

シグナルハンドラの投げ込みが悪い。シグナルハンドラで高度な処理を行うべきではありません。最終的には、フラグ(好ましくはアトミックフラグ)を設定してチェックするだけです。 –

+0

あなたが探しているものは "Coroutines"です。C++にはそれらがあるのか​​どうかは分かりませんが、C#とUnity3Dではできます。 – Brandon

+0

@Brandon "Coroutines"にはチャンスがあるようです。しかし、あなたはこの文脈でそれらを議論する任意の参考資料を提供してください。 – Virange

答えて

1

std::asyncasynclaunch policyと組み合わせて使用​​する方法もあります。

返されたstd::futurewait_forを使用して、結果の特定の時間だけ待機することができます。

時間枠内に結果が表示されない場合は、未来を保存します(結果が得られるまでdestructedにすることはできません)。

これは実際には機能を「中断」しません。終了するまで機能を継続します。しかし、それはあなたのプログラムをとにかく続ける方法です。


別の可能な解決策は、それが継続するかどうかどうかを知るためにthreadsを使用して、それに継続的にタイムアウトを確認したり、いくつかの(atomic)フラグにすることです。

+0

wait_forはいい選択ですが、私の仕事には適していません。私は1000秒の反復を持っていて、それぞれが終了しなければ、待ち時間が長くなります。 – Virange

関連する問題