2017-05-08 9 views
0

私は現在、大学のプロジェクトの一部として脳の視覚野の刺激プロバイダーを開発中です。このプログラムは、Visual StudioとOpenCVを利用して、C++で(できれば)作成することが望ましいです。動作するはずの方法は、プログラムがそれぞれの頻度のタイマーを実行する、異なる周波数の量に応じていくつかのスレッドを作成することです。 コードは、これまでに次のようになります。特定の周波数で画像を切り替えるC++

void timerThread(void *param) { 
t *args = (t*)param; 
int id = args->data1; 
float freq = args->data2; 
unsigned long period = round((double)1000/(double)freq)-1; 

while (true) { 
    Sleep(period); 
    show[id] = 1; 
    Sleep(period); 
    show[id] = 0; 
} 
} 

周波数のいくつかのために大丈夫動作しているようですが、他は、フレームレートにかなり多くを変えます。私はArduinoの "blinkWithoutDelay"関数で行われているのと同様に、自分のタイミング関数を作成しようとしましたが、これは非常にうまく機能しませんでした。また、waitKey()関数を試してみましたが、これは今ではSleep()関数とよく似ています。

ご協力いただければ幸いです!

+1

あなたが提供するコードは、問題を説明するには不十分である:何がこの 'ショーですが[id] 'のために使われましたか? – Antonio

+0

これはどのような種類の周波数でうまくいきますか、どの周波数に問題がありますか?あなたの良いと悪いフレームレートは何ですか?そして、どのようなタイプの 'show'ですか? – Useless

+0

'(double)1000 /(double)freq' ==>' 1000.0/freq' –

答えて

0

ループを完了するまでに時間がかかることがあるので、これを修正するには、スリープの代わりにタイマーを使用する必要があります。

ループの開始時にタイマーを再起動し、リセット直前に値を取得します。これにより、ループの完了に要した時間がわかります。 この時間が "period"の値より大きい場合は、遅れていることを意味し、すぐに実行する必要があります(さらに次のループの期間を短くする必要があります)。 それが低い場合は、それが大きくなるまで待つ必要があることを意味します。 私は個人的には睡眠を嫌い、代わりに常にタイマーが大きくなるまで再開します。

以下のような「固定タイムステップ」コードを調べることをおすすめします。このコードスニペットを、期間(ns)ごとに異なる値を持つすべてのスレッドに配置し、 "doUpdates()"がある場所にコードを配置する必要があります。

「タイマ」ライブラリが必要な場合、私はOpenCVを知らないので、SFMLSFML's timer docs)をお勧めします。

次のコードは、hereからである:

long int start = 0, end = 0; 
double delta = 0; 
double ns = 1000000.0/60.0; // Syncs updates at 60 per second (59 - 61) 
while (!quit) { 
    start = timeAsMicro(); 
    delta+=(double)(start - end)/ns; // You can skip dividing by ns here and do "delta >= ns" below instead // 
    end = start; 

    while (delta >= 1.0) { 
     doUpdates(); 
     delta-=1.0; 
    } 
} 

このコードでは、タイマーがリセットされることはありませんという事実を気にしてください。

(これは完全に正確ではないかもしれないが、私はあなたが提示したコード与えられたあなたの問題を解決するために作ることができる最高の仮定である)

+0

答えてくれてありがとう、私はその図書館を調べようとします! –

関連する問題