LINUX.ORG.RU

Qt + clock_nanosleep

 , ,


0

2

Прога на Qt 4.8 - есть поток который работает с железками, в нём нужно сделать очень точный слип. Делаю clock_nanosleep c TIMER_ABSTIME - и оно __вообще__ не спит. В чём может быть причина? В Qt этой штукой раньше не пользовался.Компилю с -lrt

clock_nanosleep c TIMER_ABSTIME

А правильно ли ты понимаешь, что этот флаг значит? Кстати, наносекундная формальная точность никак не гарантирует, что на деле так и будет. Даже при нулевой загрузке и идеальном железном таймере ядро может решить склеить твой таймер с каким-нибудь соседним, который не слишком далеко. Но если очень сильно захотеть...

const86 ★★★★★
()

Прога на Qt 4.8 - есть поток который работает с железками, в нём нужно сделать очень точный слип.

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

anonymous
()

C наносекундными слипами печаль и беда, во первых ядро может посчитать что что ему будет дешевле покрутить while(true) эти наносекунды чем реально снимать и ставить ваш процес с очереди исполнения - в результате получите 100% CPU usage. Во вторых гарантий нету что проснетес именно когда нужно а не через пару секунд. Лутчше конечно проектировать всю систему чтобы она была устойчава к нестабильным софтверным таймерам (там буфера добавить и тд).

С моей точки зрения для наиболее точного таймера нужно: 1. Собрать ядро с реал тайм патчами (ну или хотябы с включенным premtable - realtime). Перевести поток в котором будет тикать таймер в realtime режим (pthread_priority) (тут желательно иметь более 1-го CPU иначе у вас система может уйти в ступор). А далие либо в этом потоке вообще не засыпать и просто в цыкле проверять время через монотоник клок, либо завести таймер (open(«/dev/rtc0»), ioctl и тд) и синхронизироватся по нему.

zaz ★★★★
()

А вообще люди правду говорят, наносекунды это запредельная точность ведь 100 наносекунд это какихто 300 тиков на 3GHz CPU, система запросто может потратить эти 300 тиков на какието свои нужды ...

zaz ★★★★
()
Ответ на: комментарий от zaz

С моей точки зрения для наиболее точного таймера нужно:

то что ты советуешь - очередной говнокод, точные задержки делаются либо аппаратно, либо програмно на асимметричных системах - гипервизор/отдельное RT ядро/fpga

либо завести таймер (open(«/dev/rtc0»)

часы реального времени тикают в лучшем случае с частотой 32 кHz.

anonymous
()

ЕМНИП, у кутешного класса QThread есть метод слипа, который работает в наносекундах.

bvn13 ★★★★★
()
Ответ на: комментарий от zaz

С моей точки зрения для наиболее точного таймера нужно: 1. Собрать ядро с реал тайм патчами (ну или хотябы с включенным premtable - realtime)

ну так и есть.

во первых ядро может посчитать что что ему будет дешевле покрутить while(true) эти наносекунды чем реально снимать и ставить ваш процес с очереди исполнения - в результате получите 100% CPU usage.

Нет, так быть не может. Да и 100% взаться неоткуда даже при while(1) ибо оно не грузит проц.

Перевести поток в котором будет тикать таймер в realtime режим (pthread_priority)

да читал я все эти How To c kernel.org

golodranez ★★★★
() автор топика
Ответ на: комментарий от zaz

А вообще люди правду говорят, наносекунды это запредельная точность ведь 100 наносекунд это какихто 300 тиков на 3GHz CPU, система запросто может потратить эти 300 тиков на какието свои нужды ...

Да мне эти наносекунды не нужны, милсекунда нужна. Такие таймеры. Чего вы к ним прикопались.

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

Нет, так быть не может.

Так быть может, мало того что так даже и есть. Алгоритм принятия решения постоянно плавает от версии к версии ядра, и на каждом ядре работает по разному но получить 100% CPU usage на цыкле со слипом проще простого - я свое время по таким граблям находился.

Да и 100% взаться неоткуда даже при while(1) ибо оно не грузит проц.

Это вы глупость написали, попробуйте запустить while(1){} и посмотреть как он не грузит CPU.

zaz ★★★★
()
Ответ на: комментарий от golodranez

Для милисекунды вам вполне хватит /dev/rtc0 таймера, а слипы более-мение стабильно начинают работать на интервалах от 20 милисекунд. Например в той-же самой Windows даже в MSDN написано что точность (разрешение) слипа зависит от платформы и колеблится от 12 до 30 милисекунд.

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

zaz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.