1

プロジェクトに機能を追加したい。

ランダム配列で関数の解を見つけたいので、for ループで 2 つの関数を実行しています。ランダムな配列を作成する関数もあります。各ループで、random_array fun によって作成される配列は、2 つの関数の入力です。2 つの関数は解決策を画面に表示しますが、引数を返しません。

int main(){
    for (i=0;i<50 i++)
    {
    arr1=ramdom_array();
    func1(arr1)
    func2(arr1)
    }
}

関数が 5 分以内に終了しない場合は、関数の実行を停止する必要があります。 私は、次のような関数を入れなければならないと考えました:

void func1(array<array<int,4>,4> initial)
{
while (5minutes_not_passed)
{
//do staff
if(solution==true)
break;
}
}

しかし、5minutes_not_passed に何を入れればよいかわかりません。

関数の宣言は次のようになります。

void func1(array<array<int,4>,4> initial)
void func2(array<array<int,4>,4> initial)

私はスレッド ライブラリを使用できることを発見しましたが、スレッドと噛み合うのは良い考えではないと思います。タイマーのようなものが必要だと思います。関数は 5 分前に終了する場合があることに注意してください。

4

4 に答える 4

3

time_ttimeを使用して、現在の秒を取得します。

その値に5*60を追加します。

ループのすべての反復で時間を取得し、それが制限以上の場合は、ブレークアウトします

于 2012-06-24T02:45:54.657 に答える
0

タイムアウトのあるスレッドで関数を実行することをお勧めします。同様の質問へのリンクは次のとおりです。

C ++:任意の関数呼び出しのタイムアウトを実装するにはどうすればよいですか?

于 2012-06-24T03:02:20.690 に答える
0

スレッドを使用したくないとおっしゃっていたと思いますが、boost::threadを使用するとこれが非常に簡単になります。

boost::thread t(boost::bind(func1, arr1));
if(!t1.timed_join(boost::posix_time::minutes(5))){
    // thread still running, use interrupt or detach
}
于 2012-06-24T03:06:23.997 に答える
0

あるいは、タイマー通知を備えたkevents(freebsd)のようなものを使用することができ、Signal処理もそのトリックを実行します。 http://www.linuxquestions.org/questions/programming-9/how-to-use-sigusr1-and-sigusr2-391489/

したがって、タイムアウト後、SIGUSR1をプロセスに送信する必要があります。次に、シグナルハンドラー関数で、終了するためのロジックを設定できます。

于 2012-06-24T03:10:21.507 に答える