1

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回寝ます

4

1 に答える 1

2

ブースト 1.53 を使用する場合、これはブースト バグです。解決策は、ブースト ソースにパッチを適用するか、新しいリリースを待つか、以前のブースト バージョンにロールバックすることです。

于 2013-05-22T14:20:28.997 に答える