如何控制一個函數的執行時間

       在考慮接口設計時,想到這個問題,如何控制一個函數的執行時間呢,因爲我需要調用被其他地方繼承的函數,如果那個函數裏面有缺陷或者內容過多,導致執行時間太長怎麼辦? 

       自己想了一會,想到單個線程好像是沒辦法控制的,想到多線程,到網上搜了一下,果然其他朋友也是提到了多線程。當然也會引入同步的問題。如果有幸被哪位朋友看到,有其他好的方法也歡迎留言。




下面就是用多線程控制函數執行時間的例子,被控制的函數爲A.func1()。

一點說明:環境是C++/QT,線程使用的是QT的線程,qDebug是用來打印的,跟std::cout類似。


#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <qDebug>

#include <time.h>
#include "windows.h"

class A
{
public:
   //這個函數可能會被重載,不知道會運行多長時間,但在調用時不希望無休止的等待,如果超時就終止
   virtual void func1()
   {
       Sleep(5000);

       //考慮到這個函數會被非主線程訪問,如果訪問了成員變量,就需要考慮同步問題,加鎖了
       //member = 1111111;
   }

   int member;
};

class Thread : public QThread
{
   
public:
   Thread(A * pA) : a(pA)
   {    
   }
   
   void run()
   {
       a->func1();
   }

private:
   A *a;
};

class TestClass
{
public:

   const static int MAX_TIME = 3000; //需要5秒鐘呢,這裏最多才等待3秒鐘

   //調用函數A的func1,統計其運行時間
   bool test(A *a) const
   {
       time_t t0 = clock(), t1;
       a->func1();
       t1 = clock();

       qDebug() << t1 - t0;
       return true;
   }

   //判斷函數是否在限定是時間內結束(true),否則判爲超時(false)
   bool test2(A *a) const
   {
       Thread thread(a);
       time_t t0 = clock(), t1;
       thread.start();

       while(thread.isRunning())
       {
           t1 = clock();
           if (t1 - t0 > MAX_TIME)
           {
               thread.terminate();
               return false;
           }
           Sleep(1);    //循環時最好加上Sleep,要不CPU佔用率就很高
       }
       return true;
   }
};

int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
   
   A a;
   TestClass t;
   t.test(&a);
   qDebug() << t.test2(&a);

   return app.exec();
}

輸出結果:
5000
false


--------------------------------------------

【續】Unix下有alarm函數可以使用,可以實現過段時間讓進程重新得到控制。好像結合setjmp可以實現。

參考:http://bbs.csdn.net/topics/60110650

發佈了44 篇原創文章 · 獲贊 15 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章