2016-08-25 3 views
1

私はJavaとC++でコード化したアプリケーションを持っています。 このアプリケーションでは、正確にN秒間持続する複数の「試行」が必要です(N = 15としましょう)。 私が必要とするのは、0.005秒ごとに現在の状態を記録することです。私は、次のコードを持っている、まさにこの目的のために :2つのスレッドが同時に起動することを確認してください。

私は私が(ログラインの異なる数を取得することがわかり(そのファイルに書かれている)私のログで探していたときのものがある
std::thread timerTrial(&endTrial,this); 
std::thread timerLog(&log,this); 
std::thread timerTrial(&endTrial,this); 
timerLog.detach(); 
timerTrial.detach(); 

void endTrial(){ 
    usleep(TIME); 
    isOver = true ; 
    //... 
} 

void log(){ 
    while(isOver == false){ 
     usleep(TIMELOG); 
     //Do the logging 
    } 
} 

1つの試行ではログが14.5秒、もう1つは14.3秒、もう1回は14.8秒までログが記録されます。このコードを改善して各試行の差異を少なくする方法はありますか?

私はlog()で行わなければならないロギングが少し遅れているかもしれないと思っていますが、正に、本当に小さなロギング(主にstd :: vectorへの追加)です。 log()機能の私のwhileループで時間を無駄にしないように、このログを行うために他の並列スレッドを作成する必要がありますか?

私はこの試行の違いを減らすために、このコードを改善するためのアイデアが不足しています。私の質問が十分にはっきりしていればいいと思うそれ以上の説明を求めないようにコメントしてください。事前に

おかげで、

+1

両方のスレッド関数の開始時に待機し、特定の時点でメインスレッドから解放される条件変数を使用できます。 –

+0

@πάνταῥεῖASAP – LBes

+4

でもそうしようとしていますが...スレッドプリエンプションの決定論は、使用中のスケジューラに完全に依存しません。これはOSの問題であり、言語の問題ではありません。 –

答えて

0

は、私はUIを減速せずになんとかです回避策を発見したが判明します。 この2つのスレッドをまとめて、forというループのあるスレッドで結合しました

最終コードは次のようになります。

std::thread timerTrial(&endTrial,this); 
//.... 
void endTrial(){ 
    int nbOfLogsNeeded = //Compute how many logs I will need during the time of trial 
    for(int i = 0 ; i < nbOfLogsNeeded ; i++){ 
     std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::milliseconds(50)); 
     //Perform Logging 
    } 
} 

これは完全に質問には答えていませんが、回避策はうまく動作します。

+0

'sleep_until'に関する私のコメントは' now'を一度だけ計算し、ループにオフセットを追加することです。つまり、 'sleep_for'を使うことができます。 – Jarod42

+0

@ Jarod42それはうまく動作しますが、 – LBes

+0

私はそれがうまくいかないとは言いませんでしたが、必要に応じて自然で複雑ではありません。 – Jarod42

関連する問題