私の質問は、次の質問と正確に共鳴しました。一定時間後に機能を解除してください。 (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'
を与えます。私もカスタム例外クラスを使用しようとしましたが、エラーは持続します。
私はこの特定の実装に何が間違っているのか、別のより良いアプローチが存在するのかどうかは分かりません。どんな助けでも本当に感謝します。
シグナルハンドラの投げ込みが悪い。シグナルハンドラで高度な処理を行うべきではありません。最終的には、フラグ(好ましくはアトミックフラグ)を設定してチェックするだけです。 –
あなたが探しているものは "Coroutines"です。C++にはそれらがあるのかどうかは分かりませんが、C#とUnity3Dではできます。 – Brandon
@Brandon "Coroutines"にはチャンスがあるようです。しかし、あなたはこの文脈でそれらを議論する任意の参考資料を提供してください。 – Virange