2

我的项目有一个不同的线程来制作一些东西。

没关系,但我希望每 20 毫秒调用一次函数(例如),但考虑到函数花费的时间......我试着解释得更好......我调用了函数,函数花了 6 毫秒退出,所以我希望线程休眠 14 毫秒(20 - 6),下一次调用时,函数花费了 12 毫秒,所以休眠只有 8 毫秒....我该怎么做呢?这是我的代码:

// thread constructor
DWORD dwThreadId, dwThrdParam = 1;  
HANDLE thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)workerFunc, &dwThrdParam, 0, &dwThreadId );

// thread function
DWORD WINAPI workerFunc( LPDWORD lpdwParam )
{
    while( true )
    {
        myFunction( );
        Sleep( ??? );
    }
    return 0;
}

谢谢!

4

4 回答 4

2

那这个呢:

clock_t start, end;
while( true )
{
    start = clock();
    myFunction( );
    end = clock();
    Sleep(20-(end-start)*CLOCKS_PER_SEC/1000.0);
}
于 2011-07-18T11:35:54.813 回答
2

一个简单的方法是让线程休眠一段时间:

void periodic_function()
{
  /* function body */

  timestamp = get_time(); // pseudo-function
  remaining_sleep_time = std::min(0, 20 - (timestamp - last_timestamp));
  last_timestamp = timestamp;
  milli_sleep_callback(remaining_sleep_time, periodic_function);
}

您需要一个合适的稳定时钟功能get_time()和一个睡眠功能 - 试试<chrono>or<tr1/chrono>标头。在这个例子中,我假设你有一个计时器回调(就像在 boost.ASIO 中一样),但你也可以创建一个无限循环或类似的东西。

如果函数体从不超过 20 毫秒,则此函数将起作用,但如果您的函数需要更长的时间,它会快速赶上。如果要同步到全局 20 毫秒节奏,则必须添加另一个全局计步器或类似的东西。

于 2011-07-18T11:41:46.220 回答
1

在调用之前和调用之后使用GetTickCount。差异为您提供了在. 请注意,此时间包括进程由于操作系统调度而花费的时间。myFuncmyFuncmyFunc

于 2011-07-18T11:34:37.513 回答
0

如果您需要精度,请NtSetTimerResolution在程序启动时使用以设置计时器分辨率。是的,它是未记录的功能,但效果很好。您也可以使用NtQueryTimerResolution了解计时器分辨率(确保在设置新分辨率之前和之后)。

您需要使用GetProcAddressfrom动态获取这些函数的地址NTDLL.DLL,因为它没有在头文件或任何 LIB 文件中声明。

以这种方式设置计时器分辨率会影响SleepWindows 计时器、返回当前时间的函数等。

于 2011-08-20T12:09:11.120 回答