在考虑接口设计时,想到这个问题,如何控制一个函数的执行时间呢,因为我需要调用被其他地方继承的函数,如果那个函数里面有缺陷或者内容过多,导致执行时间太长怎么办?
自己想了一会,想到单个线程好像是没办法控制的,想到多线程,到网上搜了一下,果然其他朋友也是提到了多线程。当然也会引入同步的问题。如果有幸被哪位朋友看到,有其他好的方法也欢迎留言。
下面就是用多线程控制函数执行时间的例子,被控制的函数为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