visual studio — переключение изображения на определенных частотах

В настоящее время я занимаюсь разработкой поставщика стимулов для зрительной коры головного мозга в рамках университетского проекта. Программа должна (желательно) быть написана на C ++, используя Visual Studio и OpenCV. Предполагается, что программа работает так, что программа создает количество потоков в соответствии с количеством различных частот, каждый из которых запускает таймер для своей соответствующей частоты.
Код выглядит так:

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 (), используемая сейчас.

Любая помощь будет принята с благодарностью!

0

Решение

Вы должны использовать таймеры вместо «сна», чтобы исправить это, так как иногда цикл может занять больше или меньше времени для завершения.

Перезапустите таймер в начале цикла и примите его значение непосредственно перед сбросом — это даст вам время, необходимое для завершения цикла.
Если это время больше, чем значение «period», то это означает, что вы опоздали, и вам нужно выполнить сразу (и даже уменьшить период для следующего цикла).
В противном случае, если оно ниже, значит, вам нужно подождать, пока оно не станет больше.
Мне лично не нравится спать, и вместо этого постоянно перезапускаю таймер, пока он не станет больше.

Я предлагаю изучить код с «фиксированным временным шагом», такой как приведенный ниже. Вам нужно будет поместить этот фрагмент кода в каждый поток с различными значениями для периода (нс) и поместить свой код там, где находится «doUpdates ()».

Если вам нужна библиотека «таймер», так как я не знаю OpenCV, я рекомендую SFML (Документы таймера SFML).

Следующий код от Вот:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]