今天解决了一个小问题,记录一下
1、windows平台
工作上遇到一个问题:在一个线程里边每隔5S打印数据,想按任意键退出,但是每次退出都要等一会,因为sleep了5S,为了及时退出,采用event等待事件超时的办法就可以了。
第一步:定义一个全局handle
HANDLE hEvent = NULL;
第二步:主函数里边创建一个事件,该函数具体用法 参考百度:
https://baike.baidu.com/item/CreateEvent/917012?fr=aladdin或者https://www.cnblogs.com/tinaluo/p/7686386.html
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//初始化时无信号状态
第三步:在统计线程函数里替换掉sleep(5);
WaitForSingleObject函数用法参考:https://www.jb51.cc/windows/686419.html或者https://www.cnblogs.com/tinaluo/p/7686386.html
DWORD dReturn = WaitForSingleObject(hEvent, 5000); //有信号时才能得到,超时设置为5000毫秒,即5s,这样会一直等着触发信号,若5s之内没有触发,就退出执行下边的程序了
第四步:在按下任意键处增加触发信号
SetEvent(hEvent);
这样就实现了按下任意键及时退出的效果了,不用再等着。
2、Linux平台
1、定义全局变量
pthread_cond_t cond;
pthread_mutex_t mutex;
2、主函数中初始化
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&mutex, NULL);
3、数据统计线程中延时,规范来说应该加锁,但是不加锁也可用
struct timespec outtime; //超时变量
struct timeval now;
//pthread_mutex_lock(&mutex);//加锁
gettimeofday(&now, NULL);
outtime.tv_sec = now.tv_sec + 5; //5s
outtime.tv_nsec = now.tv_usec * 1000;
pthread_cond_timedwait(&cond, &mutex, &outtime);//如果不写mutex,会出现段错误
//pthread_mutex_unlock(&mutex);//解锁
linux中的计时是先定一个时间点,然后等系统时间到达,以此延时
4、发信号激活等待线程
//pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);//发信号
//pthread_mutex_unlock(&mutex);
Linux平台win还是不太一样的