|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.07.2010, 08:19 | #1 | |
Пользователь
Регистрация: 24.08.2007
Сообщений: 88
|
Sleep(50); за 63 мс... или за 47...
Здравствуйте . Есть клиент, сервер, сервер обрабатывает данные приходящие от клиентов и отсылает результат, результат должен отсылаться строго каждые 50 мс. Что я делаю:
1)- измеряю время обработки (clock_t start = clock()... обработка...clock_t finish = clock() ). 2) - после обработки стоит Sleep(50+start-finish) в результате кадры отсылаются каждые 63 мс... Дебаг показал что старт равен финишу, добавил еще одну временную метку после Sleep, оказалось что слип(50) длится до 63 мс.. приложение многопоточное, ось -Windows. В качестве эксперимента была выкинута обработка и прочие ненужные вещи остался голый слип(50) который все равно умудряется тянутся до 63 мс... как бы поточнее? Код:
Цитата:
Последний раз редактировалось Teksa; 14.07.2010 в 09:36. |
|
14.07.2010, 09:41 | #2 |
Форумчанин
Регистрация: 31.08.2009
Сообщений: 161
|
попробуйте функцию GetTickCount(void), впринципе она должна точно работать(точность не измерял, но читал, что она хорошо работает)...
пример использования: Код:
|
14.07.2010, 09:41 | #3 |
Участник клуба
Регистрация: 29.12.2009
Сообщений: 1,166
|
а если сделать посылку пакетов в таймере?
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть] |
14.07.2010, 09:49 | #4 |
Пользователь
Регистрация: 24.08.2007
Сообщений: 88
|
ГетТикКаунт сейчас попробую Почему то в голову не пришло, спасибо
в таймере - придется городить очередь результатов на отсылку... и потом как то регулировать доступ к ней... можно попробовать в принципе Кстати есть мысль ориентироваться по прошлому кадру, то есть если в прошлой итерации кадр проспали на 13 мс , то в этом спать на те же 13 мс меньше.. |
14.07.2010, 09:52 | #5 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
GetTickCount() не так уж хорошо работает. По моим приблизительным оценкам ее погрешность, равно как и разрешающая способность составляют порядка 10мс. Вообще, думаю, большинство таких функций работают немногим лучше, хотя не поручусь.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
14.07.2010, 10:51 | #6 | |
Пользователь
Регистрация: 24.08.2007
Сообщений: 88
|
Цитата:
Код:
|
|
14.07.2010, 14:34 | #7 | |||
Разрабатываюсь....
Пользователь
Регистрация: 16.11.2008
Сообщений: 68
|
Попробуй использовать мультимедийный таймер:
Цитата:
Цитата:
Цитата:
|
|||
15.07.2010, 22:37 | #8 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 42
|
AFAIK, этого сделать нельзя, т.к. ОС семейства Windows не относятся к операционным системам реального времени, и по этому не могут гарантировать выполнение каких-то действий в строго указанное время; всегда возможно какое-то отклонение... Даже если попытаться в цикле ждать нужного времени, как это предлагает evgn, может случиться так, что в нужное время процесс (точнее - нужный поток этого процесса) работающий по вашей программе будет не активным, и стоять в очереди ожидая очередного кванта процессорного времени на свое выполнение... Потом, когда он все же дождется своего времени, ОС может потребоваться сбросить в своп часть содержимого RAM, а затем подгрузить из свопа в RAM код и данные вашей программы; тут нужно вспомнить что операции со своп файлом (как и любые другие операции с HDD) идут относительно медленно. Подобным образом и возникают непредсказуемые задержки...
Последний раз редактировалось Oleg_SK; 15.07.2010 в 23:21. |
20.07.2010, 08:34 | #9 |
Пользователь
Регистрация: 24.08.2007
Сообщений: 88
|
на системе реального времени подобный вопрос бы и не возник, тут и была вся проблема в этом) в принципе вопрос мог звучать как "способы компенсации неточности измерения времени в операционной системе Okna ".
кстати если не отдавать sleep ом управление - все более менее стабильно вопрос не решен а скорее обойден - добавил синхронизацию по времени между клиентами и сервером, соответсвенно загулявшие задержки и тд теперь отлавливаю по временной оси. Кстати большую точность чем Sleep(50) выдавал Код:
evgn спасибо timeSetEvent() оказывается полезная штука |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
функция Sleep() | ^Angel^ | Общие вопросы C/C++ | 9 | 07.05.2011 13:27 |
Функция Sleep(); | VadEr | Общие вопросы Delphi | 6 | 10.09.2009 17:45 |
Проблема с Sleep! | k1r1ch | Общие вопросы Delphi | 11 | 20.06.2009 19:12 |
Аналог Sleep() | Ants | Общие вопросы Delphi | 2 | 18.11.2008 13:11 |
Альтернатива sleep | Zuzlan | Общие вопросы Delphi | 2 | 01.11.2007 01:44 |