在考慮接口設計時,想到這個問題,如何控制一個函數的執行時間呢,因爲我需要調用被其他地方繼承的函數,如果那個函數裏面有缺陷或者內容過多,導致執行時間太長怎麼辦?
自己想了一會,想到單個線程好像是沒辦法控制的,想到多線程,到網上搜了一下,果然其他朋友也是提到了多線程。當然也會引入同步的問題。如果有幸被哪位朋友看到,有其他好的方法也歡迎留言。
下面就是用多線程控制函數執行時間的例子,被控制的函數爲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