2017-05-08 3 views
0

Ich entwickle gerade einen Stimulus-Anbieter für den visuellen Kortex des Gehirns als Teil eines Universitätsprojekts. Das Programm soll (vorzugsweise) in C++ geschrieben werden, unter Verwendung von Visual Studio und OpenCV. Die Art und Weise, wie es funktionieren soll, ist, dass das Programm eine Anzahl von Threads entsprechend der Menge verschiedener Frequenzen erzeugt, von denen jede einen Timer für ihre jeweilige Frequenz ausführt. Der Code sieht wie folgt aus bisher:Bild bei bestimmten Frequenzen wechseln 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; 
} 
} 

Es scheint, für einen Teil der Frequenzen in Ordnung zu arbeiten, aber andere variieren ziemlich viel in Framerate. Ich habe versucht, meine eigene Timing-Funktion zu erstellen, ähnlich wie in Arduino's "blinkWithoutDelay" -Funktion, obwohl das sehr schlecht funktioniert hat. Ich habe es auch mit der Funktion waitKey() versucht, das funktionierte genauso wie die Funktion Sleep(), die jetzt verwendet wird.

Jede Hilfe würde sehr geschätzt werden!

+1

Der Code, den Sie bieten nicht ausreicht, um das Problem zu beschreiben: was ist das 'show [id] 'verwendet für? – Antonio

+0

Und für welche Art von Frequenzen funktioniert das gut und welche Frequenzen haben Probleme? Und was sind Ihre guten und schlechten Bildraten? Und welcher Typ ist 'show'? – Useless

+0

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

Antwort

0

Sie sollten Timer anstelle von "Schlaf" verwenden, um dies zu beheben, da manchmal die Schleife mehr oder weniger Zeit benötigt, um abzuschließen.

Starten Sie den Timer am Anfang der Schleife neu und nehmen Sie seinen Wert direkt vor dem Zurücksetzen - dies gibt Ihnen die Zeit, die für die Schleife benötigt wurde. Wenn diese Zeit größer ist als der Wert für "Punkt", bedeutet dies, dass Sie zu spät kommen und sofort ausgeführt werden müssen (und den Zeitraum für die nächste Schleife sogar verringern). Andernfalls, wenn es niedriger ist, bedeutet es, dass Sie warten müssen, bis es größer ist. Ich persönlich mag nicht schlafen, und stattdessen ständig den Timer neu starten, bis es größer ist.

Ich schlage vor, in "festen Zeitschritt" -Code zu suchen, wie der untenstehende. Sie müssen diesen Codeschnipsel in jeden Thread mit unterschiedlichen Werten für den Zeitraum (ns) einfügen und Ihren Code dort platzieren, wo "doUpdates()" steht.

Wenn Sie eine "Timer" -Bibliothek benötigen, da ich OpenCV nicht kenne, empfehle ich SFML (SFML's timer docs).

Der folgende Code ist aus 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; 
    } 
} 

Bitte abgesehen davon, dass in diesem Code wird der Timer nie zurückgesetzt.

(Dies kann nicht ganz richtig sein, aber ist die beste Voraussetzung kann ich Ihr Problem angesichts der Code, den Sie vorgelegt haben zu beheben machen)

+0

Danke für die Antwort, ich werde versuchen, in diese Bibliothek zu schauen! –