многопоточность — выполнение функций с интервалом переполнения стека

Итак, у меня есть программа Kinect, которая имеет три основные функции, которые собирают и сохраняют данные. Я хочу, чтобы одна из этих функций выполнялась как можно дольше, а две другие выполняются, может быть, 10 раз в секунду.

while(1)
{
...
//multi-threading to make sure color and depth events are aligned -> get skeletal data
if (WaitForSingleObject(colorEvent, 0) == 0 && WaitForSingleObject(depthEvent, 0) == 0)
{
std::thread first(getColorImage, std::ref(colorEvent), std::ref(colorStreamHandle), std::ref(colorImage));
std::thread second(getDepthImage, std::ref(depthEvent), std::ref(depthStreamHandle), std::ref(depthImage));
if (WaitForSingleObject(skeletonEvent, INFINITE) == 0)
{
first.join();
second.join();

std::thread third(getSkeletonImage, std::ref(skeletonEvent), std::ref(skeletonImage), std::ref(colorImage), std::ref(depthImage), std::ref(myfile));
third.join();
}
//if (check == 1)
//check = 2;
}
}

В настоящее время мои потоки заставляют их все работать в одно и то же время, но это сильно замедляет мой компьютер, и мне нужно всего лишь запускать ‘getColorImage’ и ‘getDepthImage’, возможно, 5-10 раз в секунду, тогда как ‘getSkeletonImage’ я бы хотел бежать как можно больше.

Я хочу, чтобы ‘getSkeletonImage’ работал с максимальной частотой (~ 30 раз / секунду через цикл while), а затем ‘getColorImage’ и ‘getDepthImage’ синхронизировались по времени (~ 5-10 раз / секунду через цикл while)

Как я могу это сделать? Я уже использую потоки, но мне нужно, чтобы один работал последовательно, а затем два других, чтобы присоединиться по существу периодически. Спасибо за помощь.

0

Решение

В настоящее время ваш основной цикл создание потоки каждую итерацию, которая предполагает, что каждая функция потока выполняется один раз до завершения. Это приводит к накладным расходам на создание и уничтожение потоков каждый раз.

Лично я не стал бы беспокоиться с темами вообще. Вместо этого в основной теме я бы сделал

void RunSkeletonEvent(int n)
{
for (i = 0; i < n; ++i)
{
//   wait required time   (i.e. to next multiple of 1/30 second)
skeletonEvent();
}
}

// and, in your main function ....

while (termination_condition_not_met)
{
runSkeletonEvent(3);
colorEvent();
runSkeletonEvent(3);
depthEvent();
}

Это чередует события, поэтому skeletonEvent() работает шесть раз за каждый раз depthEvent() а также colorEvent() запускаются. Просто настройте числа по мере необходимости, чтобы получить требуемое поведение.

Вам нужно будет разработать код для всех событий, чтобы они не выполнялись с течением времени (если они это сделают, все последующие события будут отложены — средства остановить это не будут).

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

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

Примечание: ваше использование WaitForSingleObject() указывает на то, что вы используете Windows. Windows (за исключением, возможно, CE в слабом смысле) на самом деле не является системой реального времени, поэтому не гарантирует точную синхронизацию. Другими словами, фактические интервалы, которые вы достигнете, будут отличаться.

Все еще возможно реструктурировать, чтобы использовать потоки. Из вашего описания нет никаких доказательств того, что вам действительно нужно что-то подобное, поэтому я оставлю этот ответ на этом.

1

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


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