前言
其实只有前言部分。
最近在做数据抓取的时候遇到这个问题,对文件中特定数据进行提取的时候,要求每25ms更新一次容器内容,主线程则是25ms读取一次容器内的数据。我把子线程设置成守护线程,和主线程同时运行,起初是在主线程、子线程内都设置了一个Sleep(25)函数,但是在主程序中打印出来发现有部分打印的时候会出现容器内一次更新的内容被打印2次,而它的上一次(或者说是下一次也行)的更新内容并没有被打印。思考了一下可能的原因:子线程除了做更新内容外,其余部分操作也会耗时,此时再Sleep(25)则每次更新的时间会超过25ms,就会出错。
于是去学了毫秒级精度的定时器(Windows API),用了GetTickCount()函数去替代子线程里原本的Sleep(25);
大致就是在任务函数内定义DWORD t1, t2;
在负责更新的代码块前面,加上t1 = GetTickCount();
使 t1 等于这个时刻的从操作系统启动到现在经过的毫秒数。
在更新函数里第一行加上 t2 = GetTickCount(); while((double)(t2 - t1) < 25.0 ) { t2 = GetickCount(); }
然后继续往下执行。
改动之后,主线程里每25ms就能读取到正确的容器内容了。
ps:如果有其他更好的方法或者正确的错误原因,欢迎指正哦!