如果花费太长时间,我如何让我的程序停止?

时间:2013-09-23 03:11:26

标签: c++

我正在尝试进行插入/合并排序程序,两者都做,并且它需要接受高达1000万个系列长数组的输入。对于合并排序很好,它需要几秒钟来排序,但根据我的朋友,它应该需要超过6小时的插入。我想把一个计时器放到程序中,让它在工作30分钟后停止,而不是以某种方式完成排序,但我不确定如何,或者我会把它放在哪里。

我的主要方法和插入排序的代码,因为它是唯一需要计时器的代码。任何人都知道该做什么或从哪里开始?

void insertionSort(int arr[], int length) {
    int i, j, tmp;
    for (i = 1; i < length; i++) {
        j = i;
        while (j > 0 && arr[j - 1] > arr[j]) {
            tmp = arr[j];
            arr[j] = arr[j - 1];
            arr[j - 1] = tmp;
            j--;
        }
    }
}

int main()
{
    srand (time(0));

    long x;

    cout << "how long will the array be?\n" <<
    "10, 100, 1000, 10000, 100000, 1000000, or 10000000?" << endl;
    cin >> x;

    switch(x){

        case 10:
            x = 10;
            break;

        case 100:
            x = 100;
            break;

        case 1000:
            x = 1000;
            break;

        case 10000:
            x = 10000;
            break;

        case 100000:
            x = 100000;
            break;

        case 1000000:
            x = 1000000;
            break;

        case 10000000:
            x = 10000000;
            break;

        default:
            cout << "Error, incorrect number entered, please try again!" << endl;


    }

    static int ar[10000000];

    for(int i = 0; i < x; i++){

        ar[i] = rand() % 100000001;
    }


    int c= 0;
    cout << "which sorting method would you like to use?\n" <<
    "Insertion(1), merge(2), or quick(3)? \nPlease enter the number beside the one you want to use" << endl;
    cin >> c;

    if(c == 1){
        insertionSort(ar, x);

    }
    else if(c==2){
        for (int i = 1; i < x; i *= 2) {
            for (int j = 0; j < x- i; j += 2*i) {
                int iEnd2 = (2*i < x - j) ? 2*i : x - j;
                Merge(&(ar[j]), i, iEnd2);
            }
        }


    }    else if(c==3){
        quickSort(ar,0,x-1);

    }    else{

        cout << "You did not enter a correct number, please try again" << endl;


    }

    for(int i = 0; i < x; i++){
        cout << ar[i] << endl;
    }

    return 0;
}

3 个答案:

答案 0 :(得分:0)

根据您的操作系统,您可以为程序设置特殊环境,以便在程序耗时过长(或其他条件)时程序将终止。或者,你可以生成一个只要你想要的倒计时的线程。如果它完成并且主线程仍在运行,则可以从那里终止程序。

答案 1 :(得分:0)

我可以轻松地使用ctime模块来实现:

#include <ctime>
#define HALF_HOUR 60 * 30
using namespace std;
...
clock_t start = clock();
clock_t now;
int i, j, tmp;
for (i = 1; i < length; i++) {
    j = i;
    while (j > 0 && arr[j - 1] > arr[j]) {
          now = clock();
          if ((now - start) / CLOCKS_PER_SEC) >= HALF_HOUR)
          {
              cout << "Insert sort timed out." << endl;
              return;
          }
          tmp = arr[j];
          arr[j] = arr[j - 1];
          arr[j - 1] = tmp;
          j--;
    }

答案 2 :(得分:0)

最简单的方法是实现定时回调函数。该函数将在指定的时间间隔后调用,您可以退出该函数内的程序。

有关如何实施它的更多信息,请参阅以下链接

c++ Implementing Timed Callback function