Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何运行c++;以精确的毫秒间隔运行 我需要找到一种方法,在精确的毫秒周期内触发C++函数的执行。_C++_Multithreading_Timer_Sleep_Milliseconds - Fatal编程技术网

如何运行c++;以精确的毫秒间隔运行 我需要找到一种方法,在精确的毫秒周期内触发C++函数的执行。

如何运行c++;以精确的毫秒间隔运行 我需要找到一种方法,在精确的毫秒周期内触发C++函数的执行。,c++,multithreading,timer,sleep,milliseconds,C++,Multithreading,Timer,Sleep,Milliseconds,我需要玩一个循环,每40毫秒或更短时间运行一个函数。但是为了简单起见,我们还是用40毫秒吧。 我试着让它进入睡眠状态(40),但该方法并不是在精确的时间点触发的 我只是想知道是否还有其他方法可以同步动作,然后在无尽的while循环中使用Sleep() 我甚至尝试以最大速度(CPU达到20%)玩一个循环,并测量系统时间差。然后在40毫秒后触发操作 在这两种情况下,我都遇到了延迟,但最糟糕的情况是延迟总是不同的 循环正在线程中运行 我试图给线程更大的优先级,但没有成功 附加信息 服务器正在Windo

我需要玩一个循环,每40毫秒或更短时间运行一个函数。但是为了简单起见,我们还是用40毫秒吧。 我试着让它进入睡眠状态(40),但该方法并不是在精确的时间点触发的

我只是想知道是否还有其他方法可以同步动作,然后在无尽的while循环中使用Sleep()

我甚至尝试以最大速度(CPU达到20%)玩一个循环,并测量系统时间差。然后在40毫秒后触发操作

在这两种情况下,我都遇到了延迟,但最糟糕的情况是延迟总是不同的

循环正在线程中运行

我试图给线程更大的优先级,但没有成功

附加信息


服务器正在Windows 7操作系统上运行。

您可以使用以下功能跟踪时间:


timeGetTime
是标准的windows函数,它以毫秒为单位跟踪时间。如果该函数不够精确,您将不得不使用一些可以跟踪纳秒的函数,例如,web上有很多关于如何使用该函数的示例。

您可以使用以下函数跟踪时间:



timeGetTime
是标准的windows函数,它以毫秒为单位跟踪时间。如果该功能不够精确,您将不得不使用一些可以跟踪纳秒的功能,例如,web上有很多关于如何使用该功能的示例。

这已经在[Q&a][1]中得到了回答。[1] :您能否提供更多有关环境(操作系统、硬件等)的信息?你需要每隔40毫秒执行一次的东西的确切原因是什么?我需要在XBMC播放器中播放一部电影,它需要以特定的帧速率向服务器发送数据。因此,每帧25 fps=40 ms。服务器需要在特定时间向某些硬件发送一些值,并且需要同步。一切都在Windows操作系统上运行。不幸的是,没有实时操作系统。那么你已经知道答案了,你做错了。只有在显示视频的程序中才需要可靠的帧速率。上游经历了什么样的随机延迟完全无关紧要,只需要缓冲。这已经在[Q&A][1]中得到了回答。[1] :您能否提供更多有关环境(操作系统、硬件等)的信息?你需要每隔40毫秒执行一次的东西的确切原因是什么?我需要在XBMC播放器中播放一部电影,它需要以特定的帧速率向服务器发送数据。因此,每帧25 fps=40 ms。服务器需要在特定时间向某些硬件发送一些值,并且需要同步。一切都在Windows操作系统上运行。不幸的是,没有实时操作系统。那么你已经知道答案了,你做错了。只有在显示视频的程序中才需要可靠的帧速率。上游经历了什么样的随机延迟完全无关紧要,只需要缓冲。我建议在while循环中加入一些最小的
usleep()
或其他定时阻塞函数,而不是如此繁忙(占用大量CPU)等等,这不包括完成关键功能所需的时间。如果该函数的持续时间不同,您将无法获得正确的间隔。我不太了解Windows上的多媒体编程,但轮询循环是正确的选择吗?!实际上,要做的事情是一直睡到下一次回调时间(例如,usleep(max(0,last_call_time+40-timeGetTime());没错。不管我怎么做,睡眠时间都是40毫秒41毫秒42 43毫秒…你永远不知道有多少。我建议你放一些最小的
usleep()
或while循环中的其他定时阻塞功能,而不是如此繁忙(占用大量CPU)等等。这不包括执行关键函数所需的时间长度。如果该函数的持续时间不同,您将无法获得正确的间隔。我对Windows上的多媒体编程了解不多,但轮询循环是正确的选择吗?!实际上要做的是在下一次回调时间之前睡眠(例如usleep(max(0,last_call_time+40-timeGetTime());完全正确。无论我如何尝试,睡眠持续40毫秒41毫秒42毫秒43毫秒…你永远不知道有多少。
void main()
{
    unsigned int last_call_time = timeGetTime();

    while(true)
    {
        do_something_else();

        unsigned int now_time = timeGetTime();
        if(now_time > (last_call_time + 40))
        {
            call_time_critical_function();
            last_call_time = timeGetTime();//last time is re initialized
        }
    }
}