mytime T = { 3000,5000 };
HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, f1, &T, 0, NULL);//运行f1函数,并传入结构体参数
int signal=WaitForSingleObject(hThread1, 4000);//设置运行4s
//如果超出4s,则跳过该函数
if (signal != WAIT_OBJECT_0)
cout << "time out" << endl;
TerminateProcess(hThread1, -1);
CloseHandle(hThread1);
clock_t end_time = clock();
cout << "The run time is: " << (double)(end_time-start_time) / CLOCKS_PER_SEC << "s" << endl;
3000 5000
time out
The run time is: 4.001s
原本该函数应该睡眠8s后,退出,由于定时4s,所以超时后,直接退出了该函数。
#include<Windows.h>
#include<iostream>
#include<tchar.h>
#include<string>
#include<ctime>
using namespace std;
struct mytime
int t1;
int t2;
DWORD WINAPI f1(LPVOID lpParameter)
mytime* t = (mytime*)lpParameter;
cout << t->t1 << " " << t->t2 << endl;
Sleep(t->t1 + t->t2);
return 0;
int main()
clock_t start_time = clock();
mytime T = { 3000,5000 };
HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, f1, &T, 0, NULL);
int signal=WaitForSingleObject(hThread1, INFINITE);//一直等到f1函数运行完
if (signal != WAIT_OBJECT_0)
cout << "time out" << endl;
TerminateProcess(hThread1, -1);
CloseHandle(hThread1);
clock_t end_time = clock();
cout << "The run time is: " << (double)(end_time-start_time) / CLOCKS_PER_SEC << "s" << endl;
3000 5000
The run time is: 8.001s
如果不设置定时,那么就会直到该函数运行8s后,自动退出
#include<Windows.h>#include<iostream>#include<tchar.h>#include<string>#include<ctime>using namespace std;struct mytime//定义一个传入函数的结构体{ int t1; int t2;};DWORD WINAPI f1(LPVOID lpParameter)//定义一个需要运行的函数{ mytime* .
本文实例讲述了C++设置超时时间的简单实现方法,代码简单易懂,功能实用。分享给大家供大家参考。具体实现方法如下:
代码如下:BOOL SetTimeOut(SOCKET s, int nTime, BOOL bRecv)
int ret = ::setsockopt(s, SOL_SOCKET, bRecv?SO_RCVTIMEO:SO_SNDTIMEO, (char*)nTime, sizeof(nTime));
return ret!=SOCKET_ERROR;
此处setsockopt为针对套接口的操作,感兴趣的朋友可以查阅相关资料做进一步了解。
计算函数的执行时间,粒度比较小,往往也能从中发现项目代码的瓶颈,及时发现问题来提升系统的性能。
c++代码时间的估算首先考虑几个时间函数:clock_gettime( ) 、gettimeofday()、_ftime()、time(),其中clock_gettime( ) 提供了纳秒级的精确度,更加准确,可以选用。
同时要考虑到往函数注入时间计算函数的时候,对于原代码要考虑易用性,尽量使用配置
大家应该都有所体会,时钟这个东西在程序中扮演者重要的角色,在系统编程的时候睡眠、带超时的等待、带超时的条件变量、带超时的锁都会用到,但是往往对特定系统依赖性很大,感觉即使不考虑系统的跨平台性,如果能使用一个稳定的接口,同时如果能够方便的对时刻、时段等进行相关的操作和运算,将是再好不过的了。
在boost库中和时间相关的库有Boost.DateTime和Boost.Chrono,前者专注于时间时刻以及本地化相关的内容,而后者主要是时刻、时长和时间的计算等内容。当然,C++11标准已经支持std::chrono了,但是为了兼容老编译系统现在很多C++库和程序都使用boost.chrono作
退出线程可以有四种方法:
1.线程
函数的return返回(最好这样):其中用线程
函数的return返回, 而终止线程是最安全的, 在线程
函数return返回后, 会清理
函数内申请的类对象, 即调用这些对象的析构
函数. 然后会自动调用 _endthreadex()
函数来清理 _beginthreadex(…)
函数申请的资源(主要是创建的tiddata对象).
2.调用 _endthreadex()
函数 或 ExitThread()
函数(最好不要):如果使用这两种方法退出线程, 则不会执行线程
函数的return语句, 所以就不会调用线程
函数作用域内申请的类对象的析构
函数, 会造成内存泄露.
有时,当你阻塞以等待一个事件的发生时,你希望对等待的时间做一些限制。这时,一些具有时间限制的等待函数可以满足你的要求。
限时等待允许你在交互操作中告诉对方,你“仍然活着”;或者如果用户点击了取消按钮,仍然可以结束等待状态。
有两种超时方式你可以选择:一种是时间长度,另一种是时间点。大多数的等待函数都同时提供了这两种方式,设置等待时间长度的函数以_for作为后缀,而设置等待的时间点的
1. 使用clock
函数:
可以使用
C++标准库中的clock()
函数来计算
函数执行时间。clock()
函数返回的是处理器时钟所使用的时间,需要将其转换为秒数进行比较。同时,需要注意一些系统中clock()的精度问题,有些系统的clock()精度可能比较低。
示例代码如下:
```
c++
#include <ctime>
#include <iostream>
using namespace std;
bool isTimeout(clock_t start, double timeout)
clock_t end = clock();
double duration = (double)(end - start) / CLOCKS_PER_SEC;
if (duration > timeout)
return true;
return false;
void testFunction()
clock_t start = clock();
while (!isTimeout(start, 1.0)) // 判断是否
超时
// 执行代码
int main()
testFunction();
return 0;
2. 使用线程:
可以创建
一个新线程来执行
函数,并
设置线程等待时间,若线程在规定时间内未结束,则判断为
超时。需要注意的是,线程的等待时间需要根据
函数的执行时间进行调整,否则可能会导致一些误判。
示例代码如下:
```
c++
#include <thread>
#include <iostream>
using namespace std;
void testFunction()
// 执行代码
void checkTimeout(int timeout)
this_thread::sleep_for(chrono::milliseconds(timeout)); // 等待timeout毫秒
if (testThread.joinable()) // 判断线程是否结束
testThread.detach(); // 结束线程
cout << "Function timeout!" << endl;
int main()
thread testThread(testFunction); // 创建新线程执行
函数
thread timeoutThread(checkTimeout, 1000); // 创建新线程检测
超时
testThread.join(); // 等待线程结束
timeoutThread.join(); // 等待
超时检测线程结束
return 0;
以上两种方法各有优缺点,需要根据具体情况进行选择。