5

C++ でチェック システムを実装しています。さまざまなテストで実行可能ファイルを実行します。解決策が正しくない場合、特定の難しいテストが完了するまでに永遠にかかる可能性があります。そのため、実行時間を 5 秒に制限したいと考えています。

system() 関数を使用して実行可能ファイルを実行しています。

system("./solution");

.NET には優れたWaitForExit()方法がありますが、ネイティブ C++ はどうでしょうか。私も Qt を使用しているので、Qt ベースのソリューションは大歓迎です。

外部プロセスの実行時間を 5 秒に制限する方法はありますか?

ありがとう

4

6 に答える 6

5

QProcessaを a と一緒に使用すると、 QTimer5 秒後にそれを殺すことができます。何かのようなもの;

QProcess proc;
QTimer timer;

connect(&timer, SIGNAL(timeout()), this, SLOT(checkProcess());
proc.start("/full/path/to/solution");
timer.start(5*1000);

そして実装しcheckProcess()ます。

void checkProcess()
{
    if (proc.state() != QProcess::NotRunning())
        proc.kill();
}
于 2011-01-01T11:01:03.557 に答える
2

Boost.Threadをチェックして、別のスレッドでシステム コールを実行し、timed_joinメソッドを使用して実行時間を制限できるようにします。

何かのようなもの:

void run_tests()
{
    system("./solution");
}

int main()
{
    boost::thread test_thread(&run_tests);

    if (test_thread.timed_join(boost::posix_time::seconds(5)))
    {
        // Thread finished within 5 seconds, all fine.
    }
    else
    {
        // Wasn't complete within 5 seconds, need to stop the thread
    }
}

最も難しい部分は、スレッドを適切に終了する方法を決定することです (test_thread がまだ実行中であることに注意してください)。

于 2011-01-01T13:54:53.280 に答える
2

必要な作業を行うために別のスレッドを使用し、別のスレッドから、 pthread_cancle ()しばらく (5 秒) 後にワーカー スレッドに呼び出しを発行します。適切なハンドラーとスレッドのキャンセル可能オプションを登録してください。

詳細については、http ://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html を参照してください。

于 2011-01-01T11:13:38.753 に答える
1
void WaitForExit(void*)
{
    Sleep(5000);
    exit(0);
}

そしてそれを使用します(Windows固有):

_beginthread(WaitForExit, 0, 0);
于 2011-01-01T11:08:13.670 に答える
0

Windows 上のソリューション テスト システムでは、ジョブ オブジェクトを使用して、システムへのアクセスと実行時間を制限する必要があります (リアルタイムではありません)。

于 2011-01-01T11:17:41.520 に答える
0

Posix 準拠のシステム (MacOS と Unix が一般的) を使用している場合は、「waitpid システムfork execv」と「waitpidシステム」を使用します。instead of例はここにあります。ここで唯一本当に難しいのは、タイムアウト付きの waitpid を取得する方法です。アイデアについては、こちらをご覧ください。

于 2011-01-01T16:46:09.937 に答える