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