2011-07-18 8 views
2

私はいくつかのものを作る別のスレッドで自分のプロジェクトを持っています。C++スレッドとしてスレッドを使用

これは大丈夫ですが、20msごとにいくつかの関数を使用したいと思いますが、関数に費やされた時間を考慮して...私は関数を呼び出し、関数を費やしました6msは終了するので、私はスレッドが14ms(20 - 6)をスリープ状態にすることを望むので、次回の呼び出しでは、関数は12msを費やしたので、スリープはわずか8msになります.... どうすればいいですか? ここに私のコードです:

// 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; 
} 

ありがとう!

+0

iは、その後、20眠るそれらを引く、あまりにもGETのシステム時間を戻した後は、getシステム時刻を入力する前に考える - 結果を。それはあなたがどれだけ待つべきかを計算する時間を失うので近似になります。 –

答えて

2

これについて何:

clock_t start, end; 
while(true) 
{ 
    start = clock(); 
    myFunction(); 
    end = clock(); 
    Sleep(20-(end-start)*CLOCKS_PER_SEC/1000.0); 
} 
+0

+1、Sleepはunsigned int(http://preview.tinyurl.com/5uydxea)を期待しているので、end-start> 20ならクラッシュガードが必要かもしれません。 – sum1stolemyname

1

myFuncを呼び出してからmyFuncに電話をかける前にGetTickCountを使用してください。その差は、myFuncで過ごす時間を与えます。この時間には、OSのスケジューリングのためにプロセスが費やした時間が含まれています。

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>または<tr1/chrono>ヘッダーを試してください。この例では、boost.ASIOのようにタイマーコールバックを持っていると仮定していますが、無限ループなどを作成することもできます。

この関数は関数本体が20msを超えない場合に機能しますが、関数がより長くての場合は速やかに追い付きます。グローバル20msのリズムに同期させたい場合は、別のグローバル・ステップ・カウンターなどを追加する必要があります。

0

精度が必要な場合は、プログラムが起動してタイマの解像度を設定するときにNtSetTimerResolutionを使用します。はい、それは文書化されていない機能ですが、うまく機能します。タイマ解像度を知るには(設定する前と新しい解像度を設定した後に)、NtQueryTimerResolutionを使用することもできます。

GetProcAddressNTDLL.DLLから動的に取得する必要があります。ヘッダまたは任意のLIBファイルで宣言されていないためです。

は、この方法がSleepに影響を与えるタイマーの解像度を設定すると、Windowsのタイマー、現在の時刻を返す関数など