Boost C++ ライブラリを使用していますが、sleep_for 関数に問題があります。非常に時間がかかります!!! スレッドを 1 秒間だけスリープさせたい場合は、スレッドを 2 秒間スリープさせます!!!
Windows 7 (x64) のコンパイラとして msvc 2010 を使用しています。ライブラリは x86 命令セットでコンパイルされます。私のアプリケーションには約 5 つのスレッドがあり、割り込みポイントを使用しているため、(可能であれば) Sleep 呼び出しに置き換えたくありません。
代替手段はありますか?私
いくつかの例:
static const boost::chrono::microseconds timeToSleep( 40000 );
DWORD dwStart = timeGetTime();
boost::this_thread::sleep_for( timeToSleep );
DWORD elapsed = timeGetTime() - dwStart;
BOOST_LOG_TRIVIAL( trace ) << "elapsed: " << elapsed << "ms" << std::endl;
このプリントは常に 80 ザ ダブル
私が書く場合:
static const boost::chrono::microseconds timeToSleep( 80000 );
簡単に言えば、睡眠 x が必要な場合は、2 x 眠ります。デバッグ モードとリリース モードを切り替えましたが、結果は同じです。
私は何か間違っていますか?これは非常に奇妙です
編集
#define BOOST_TEST_MODULE SLEEP_FOR_TEST_SUIT
#include <boost/test/unit_test.hpp>
#include <boost/log/trivial.hpp>
#include <boost/thread.hpp>
#include <Windows.h>
#include <MMSystem.h>
#pragma comment( lib, "Winmm.lib" )
using namespace boost;
BOOST_AUTO_TEST_CASE( sleep_test )
{
for ( int i = 0; i < 1000000; i += 10000 )
{
chrono::microseconds toSleep( i );
DWORD dwStart = timeGetTime();
this_thread::sleep_for( toSleep );
BOOST_LOG_TRIVIAL( info )
<< "this_thread::sleep_for( chrono::microseconds( " << i / 1000 << " ) has slept: "
<< timeGetTime() - dwStart << "ms";
}
}
これは常に2回寝ます