Ошибка функции сна в C - PullRequest
3 голосов
/ 28 мая 2010

У меня есть файл данных Dump, в котором доступны разные данные с метками времени, я получаю время из метки времени и сплю с потоком c в течение этого времени. Но проблема в том, что фактическая разница во времени составляет 10 секунд, а данные, которые я получаю на принимающей стороне, задерживаются почти на 14, 15 секунд. Я использую оконную ОС. Пожалуйста, ведите меня.

Извините за мой недельный английский.

Ответы [ 5 ]

3 голосов
/ 28 мая 2010

Функция сна будет спать по крайней мере столько времени, сколько вы укажете, но нет гарантии, что она не будет спать дольше. Если вам нужен точный интервал, вам нужно будет использовать какой-то другой механизм.

2 голосов
/ 28 мая 2010

Если я хорошо понимаю:

  • у вас есть поток, который отправляет данные (через сеть? Каков источник данных?)
  • Вы замедляете посылку ритма с помощью сна
  • полученные данные (на другом конце сети) могут быть задержаны намного больше (15 с вместо 10 с)

Если вышеописанное описывает, что вы делаете, у вашего дизайна есть несколько недостатков:

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

Если вы дадите больше подробностей, вам будет легче диагностировать источник проблемы. sleep как вы считаете (это действительно плохой таймер) или какая-то другая часть вашей системы.

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

Если это действительно источник дополнительного времени, вам просто нужно удалить это время из следующего времени ожидания.

Пример: отправка предыдущего блока данных заняла 4 секунды, следующий блок - через 10 секунд, но поскольку вы уже использовали 4 секунды, вы просто ждете 6 секунд.

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

Исправление сон не так плох в среде Windows, как в Unix. Точность сна Windows составляет миллисекунду, точность сна Unix - секунда. Если вам не нужна высокоточная синхронизация (а если сеть задействована, высокоточная синхронизация вне досягаемости), то сон должен быть в порядке.

1 голос
/ 28 мая 2010

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

Другое решение состоит в том, чтобы реализовать «контролируемый» сон, то есть сон в течение 500 мс, проверяя текущую метку времени между ними. Итак, если все ваши будут спать 1 с вместо 500 мс на каком-то шаге - вы заметите это и не будете делать дополнительный сон (500 мс).

0 голосов
/ 28 мая 2010

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

Вы также можете использовать планировщик задач Windows, но это выходит за рамки программных автономных опций.

0 голосов
/ 28 мая 2010

Попробуйте Мультимедийный таймер . Это примерно так же точно, как вы можете получить в системе Windows. О CodeProject есть хорошая статья о них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...