如何控制一个函数的执行时间

时间:2023-02-04 18:12:23

       在考虑接口设计时,想到这个问题,如何控制一个函数的执行时间呢,因为我需要调用被其他地方继承的函数,如果那个函数里面有缺陷或者内容过多,导致执行时间太长怎么办? 

       自己想了一会,想到单个线程好像是没办法控制的,想到多线程,到网上搜了一下,果然其他朋友也是提到了多线程。当然也会引入同步的问题。如果有幸被哪位朋友看到,有其他好的方法也欢迎留言。




下面就是用多线程控制函数执行时间的例子,被控制的函数为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