На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Задержка длительностью 0,1 мс ? , Как можно сделать задержку длительностью 0,1 мс ?
    Привет всем.
    В моей программе нужно сделать задержку 0,1 мс, или можно принимать событие таймера через каждые 0,1 мс. Но функции Sleep() и SetTimer() позволяют установить задержку не меньше 1 мс, т.к. в параметрах принимают только целые значения. Как я могу сделать задержку 0,1 мс ?
      сверхточный отсчет времени
      :) оно поможет. класс позволяет измерять время с точностью до микросекунды
        Пусть даже ты сверхточно посчитаешь это время, но задержку в 0,1 миллисекунды никогда не получишь в многозадачной системе. Только дос, rtklinux и прочее.
          Паровоз
          получит, с небольшой погрешностью но получит:
          из моего примера:
          ExpandedWrap disabled
            void usleep( int mc_sleep)
            {
             ulong64 t1 = timer.GetTickCount64();
             for(;;)
             {
              ulong64 t2 = timer.GetTickCount64();
              if( t2 - t1 >= mc_sleep ) return;
             }
            }
            Получит... если не дышать на программу... если выполнять ее на высокопроизводительном процессоре... если мало параллельно выполняющихся программ... не шевелить мышкой в конце концов)))
              Паровоз
              не тупи. Sleep в цикле не используется.
              постоянно GetTickCount вызывается, процесс выполняется и винда не переключится на обработку другого процесса.
              впринципе процессу можно наивысший приоритет выставить перед вызовом функции задержки а потом вернуть прежний.
              я таким методом от 50 до 500 микросекунд выдерживал паузы. прога поршивала микруху А24С64 по протоколу I2C
              а там погрешность в таймаутах не более 30% так что сам считай.
                Цитата progman @
                Паровоз
                не тупи. Sleep в цикле не используется.
                постоянно GetTickCount вызывается, процесс выполняется и винда не переключится на обработку другого процесса.
                впринципе процессу можно наивысший приоритет выставить перед вызовом функции задержки а потом вернуть прежний.
                я таким методом от 50 до 500 микросекунд выдерживал паузы. прога поршивала микруху А24С64 по протоколу I2C
                а там погрешность в таймаутах не более 30% так что сам считай.

                а если тут вдруг стартанет высокоприоритетный поток и начнет чтото делать?
                а если еще хуже - драйвер какойнить вдруг решит пошевелится.

                в общем такие маленькие задержки с погрешностью 30% получить нереально практически. оно может то работать, то вдруг сбойнуть.. в общем стабильно получать такие задержки нельзя..
                  Цитата LuckLess @
                  в общем такие маленькие задержки с погрешностью 30% получить нереально практически. оно может то работать, то вдруг сбойнуть.. в общем стабильно получать такие задержки нельзя..

                  спорно.
                  у меня прога микруху прошивала а на фоне WinAmp играл, и ниче, без сбоев прошиватель пахал.

                  Добавлено
                  хотя согласен, чтобы 100% точно выдерживать надо на уровне драйвера решать такие задачи.
                    наваял тут код смешной - но в тему..
                    задержка в 1/10000 секунды есть :lool: :lool:
                    ExpandedWrap disabled
                         int cycles = 0;
                            {
                            const int NumTries = 2;//чем больше - тем дольше и точнее )))))
                            int tm = 0;
                            for (int i = 0; i < NumTries; ++i)
                               {
                               int rm = GetTickCount ();
                               rm += 1000;
                               while (GetTickCount () < rm) ++tm;
                               }
                            tm /= NumTries;
                       
                            cycles = tm;
                            }
                        
                         cycles /= 10000;
                         cycles *= 2.8; // магический кооффициент для моего компилятора и его текущих настроек
                                        
                       
                         //проверка страшных вычислений.
                         int check = 0;
                         int tm = GetTickCount ();
                         for (int i = 0; i < 10000; ++i)
                            {
                            int j = 0;
                            while (j++ < cycles);//задержка
                            ++check;
                            }
                         tm = GetTickCount () - tm;
                       
                         std::cout << "elapsed - " << tm << " miliseconds   ------ result = " << check;


                    не воспринимайте только серьезно :lol:
                      Цитата LuckLess @
                      не воспринимайте только серьезно :lol: [/COLOR]

                      а чо тада не в "Юмор" :lol: :D ;)
                        В этих прекрасных методах есть один недостаток. Во время реализации точного метода Sleep() через gettickcount - проц встает раком на 100% загрузки.
                          Большое спасибо за правильный совет. Я им воспользовался. Для моего приложения все работает как нужно. Поэтому дискуссии о том, получу я нужную мне задержку, или не получу - можно остановить, так как необходимую задержку уже получил.
                            Цитата Alexandoros @
                            В этих прекрасных методах есть один недостаток. Во время реализации точного метода Sleep() через gettickcount - проц встает раком на 100% загрузки.

                            и? а не пофиг повисеть миллисекунду, другую?
                            зато ОС скорее всего не переключит управление на другой процесс
                              Действительно, моя прога иногда может и повисеть одну-другую миллисекунды, это не критично, но в целом задержка 0,1мс выдерживается с достаточной для моей проги точностью, так что код, предложенный Progman - позволяет довольно точно выдерживать временные интервалы менее 1мс.
                                progman
                                Не груби! Нет в твоем методе гарантии, что задержка всегда будет в одну миллисекунду.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0348 ]   [ 16 queries used ]   [ Generated: 25.04.24, 06:47 GMT ]