Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 268, средняя оценка - 4.81
Dweyn
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
#1

Задержка в микроседундах - C++

14.01.2009, 19:55. Просмотров 35528. Ответов 20
Метки нет (Все метки)

Подскажите,можно ли как-нибудь сделать задержку в 30-40 микросекунд?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2009, 19:55     Задержка в микроседундах
Посмотрите здесь:

Задержка - C++
Использую MinGW через NetBeans. Проблема состоит в том что такие команды как cin.get или же getchar() судя по всему игнорируются...

Задержка в приложении - C++
Привет всем ) подскажите пожалуйста что можно использовать в виде задержки в приложении вместо sleep так как если его использовать...

Задержка времени - C++
Здравствуйте! Мне необходимо сделать задержку времени, чтобы перемещение элемента было помедленнее. Пробовала использовать Sleep(), но...

задержка времени - C++
Господа програмисты не подскажите как задержать программу на определённое время.если можно самый примитивный исходник.заранее огромное...

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

Задержка экрана - C++
Какой командой задерживается окно программы, для того чтобы вылетал в окно эдитора после нажатия любой клавиши, или Enterа?

Задержка и язык. - C++
У меня в конце консольных приложениях появляется задержка "Для продолжения..." и изначально русский язык, как убрать это?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mecid
679 / 228 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
14.01.2009, 20:33     Задержка в микроседундах #2
C++
1
2
3
4
5
#include <windows.h>
int main(){
Sleep(40);
return 0;
}
Dweyn
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
14.01.2009, 20:40  [ТС]     Задержка в микроседундах #3
Цитата Сообщение от Mecid Посмотреть сообщение
C++
1
2
3
4
5
#include <windows.h>
int main(){
Sleep(40);
return 0;
}
Это задержка в 40 МИЛЛИсекунд,нада в МИКРОсекундах.
maximus09
32 / 32 / 3
Регистрация: 29.12.2008
Сообщений: 75
14.01.2009, 20:42     Задержка в микроседундах #4
При программировании в Windows помогает API-функция Sleep.

Заголовочный файл winbase.h

Синтаксис
void Sleep(DWORD dwMilliseconds);
DWORD SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable);

Однако под DOS и консольных приложений я таких функций не знаю.

Может помочь следующее (я проверял на консоле в Borland С++ Builder 6).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include   <dos.h>
 
int main(int argc, char* argv[])
{
    struct  time t1,t2;
 
    gettime(&t1);
 
    do{
        gettime(&t2);
    }while((t2.ti_hund - t1.ti_hund)<3);
 
 
    return 0;
}
Структура time возвращает текущее системное время. Элемент ti_hund - сотые доли секунды.

Программа запрашивает системное время до входа в цикл и при каждом повторении цикла. Как только эти значения станут отличаться на 3 сотых секунды (30 милисекунд), произойдет выход из цикла.
Dweyn
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
14.01.2009, 20:50  [ТС]     Задержка в микроседундах #5
Ну дык это тоже МИЛЛИсекунды.
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
14.01.2009, 21:18     Задержка в микроседундах #6
для нано и микро секундных задержек используется либо мультимедиа таймер из winmm, либо ассемблерная инструкция rdtsc (количество тиков).
если нужно позже прикреплю модули для калибровки и задержек этими способами
maximus09
32 / 32 / 3
Регистрация: 29.12.2008
Сообщений: 75
14.01.2009, 21:28     Задержка в микроседундах #7
При программировании в Windows столь короткие задаржки ты никогда не сделаешь. Там даже таймеры рекомендуют для большой точности брать с интервалом в 2 секунды (не меньше), хотя документально они обеспечивают милисекундную точность.

Если работаешь напрямую с процессором (на ассемблере), старайся считать количество тактов, затраченное навыполнение какой-то конкретной операции. Иного пути я не знаю.
Dweyn
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
14.01.2009, 21:31  [ТС]     Задержка в микроседундах #8
Понял,спасибо,буду думать как обойтись без задержек.
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
14.01.2009, 21:48     Задержка в микроседундах #9
нормально все реализуется нечего глупости говорить.
например у Щупака в книге все отлично описано
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
15.01.2009, 11:38     Задержка в микроседундах #10
см. вложение
Вложения
Тип файла: rar timers.rar (47.4 Кб, 1077 просмотров)
Mecid
679 / 228 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
16.01.2009, 18:05     Задержка в микроседундах #11
Можно использовать заднржку милисекунду,микро даже не даст результат
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
16.01.2009, 19:05     Задержка в микроседундах #12
2Mecid
никаких проблем
во вложений модули позволяют делать микро задержки
maximus09
32 / 32 / 3
Регистрация: 29.12.2008
Сообщений: 75
16.01.2009, 20:11     Задержка в микроседундах #13
Очень не хотелось бы, чтобы мой вопрос выглядел как провокационный, но все же.

Уважаемый Ensase, откуда вы знаете, что получаются именно задаержки в 30 микросекунд. Вы их точно измеряли, или доверились Щупаку?

Я уже говорил выше, что подсчет количества тактов микропроцессора - самый оптимальный способ организовать столь малые задержки. Вы же, в подтверждение этих слов представили примеры кода. За что вам огромное спасибо. Однако обеспечится ли реально для многопроцессной системы Windows задержка именно в 30 микросекунд. Если вы уверены в этом, расскажите, пожалуйста, каким образом вам удалось обнаружить столь короткую задержку (если, конечно, это не секрет)?

P.S.
Я уже рассказывал о таймерах, которые считают с точностью до милисекунд, но на практике минимальный интервал, который имеет смысл задавать для них - это полсекунды, а самая лучшая синхронизация с реальным временем достигается, когда их интервал равен 1 - 2 секундам (в зависимости от количества одновременно выполняющихся в Windows процессов).
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
16.01.2009, 21:32     Задержка в микроседундах #14
при программировании спектрометра работал с ацп и шаговым двигателем практически в реальном времени (с высоким приоритетом) задержки после пересчета составляют даже менее 30 микро.
хотя, разумеется ввиду того что windows os не реального времени приходилось следить за загрузкой цп
пользовался схемой с использованием rdtsc
Scout
0 / 0 / 0
Регистрация: 22.01.2009
Сообщений: 6
23.01.2009, 18:16     Задержка в микроседундах #15
посмотри http://www.cyberforum.ru/delphi-begi....html?posted=1
будем бороться вместе.

Добавлено через 18 часов 34 минуты 17 секунд
Цитата Сообщение от Ensase Посмотреть сообщение
timers.rar
пардон... я, как начинающий самоучка не въезжаю. это, наверное, на С?
Нельзя ли поподробнее -
1. какой наикоротейшей задержки удалось добиться
2. тесты может выложишь в ехе?
3. и можешь ли сделать таймеры в осх компоненты?
Hansik
Сообщений: n/a
04.02.2009, 19:54     Задержка в микроседундах #16
Тоже столснулся с рпоблемой таймера, правда на VB... Можно узнать хотя бы результаты теста?
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
05.02.2009, 06:25     Задержка в микроседундах #17
Цитата Сообщение от Ensase Посмотреть сообщение
при программировании спектрометра работал с ацп и шаговым двигателем практически в реальном времени (с высоким приоритетом) задержки после пересчета составляют даже менее 30 микро.
хотя, разумеется ввиду того что windows os не реального времени приходилось следить за загрузкой цп
пользовался схемой с использованием rdtsc
Повторяю
Scout
0 / 0 / 0
Регистрация: 22.01.2009
Сообщений: 6
17.02.2009, 12:52     Задержка в микроседундах #18
вот тут походая тема разбирается, правда на дельфи.

[ Системный таймер и частота процессора"] [/URL]

Добавлено через 30 минут 34 секунды
... правда сам я оттуда мало что понял. .... нужно, похоже, осваивать альтернативные языки програмирования.
хотя алгаритм понятен, но вот потоки....

Добавлено через 23 часа 5 минут 50 секунд
Цитата Сообщение от Hansik Посмотреть сообщение
Тоже столснулся с рпоблемой таймера, правда на VB... Можно узнать хотя бы результаты теста?
почитай мои сообщения в ветке таймер под VB там всё, что мне удалось нарыть и примеры и источники в архиве. Ensase, правда предлагает намного лучий вариант. но вот как использовать его в VB? я как начинающий не понял суть калибровки, не смог организовать потоки, плюс там приходится используя ф-цию апи - преобразовывать тип данных в пользовательский, понятный для VB, а это лишняя трата времени.

может, кто в дельфе сечёт сможет скомпилировать осх-файл под дельфи из [ Системный таймер и частота процессора"]

... по аналогии с vb вроде когда класс готов - всего-то нужно нажать <Создать ActiveX> и скопировать туда класс, да присоединить иконку. вроде как всё.

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

Код
unit TimeDelayManager; 

interface 

uses Windows, Forms, Classes; 

type 
  TTimeDelayManager = class; 

  TTimerThread = class(TThread) 
  private 
    FOwner: TTimeDelayManager; 
  protected 
    procedure DoUserEvent; 
  public 
    constructor Create(CreateSuspended: Boolean; AOwner: TTimeDelayManager); 
  protected 
    procedure Execute; override; 
  end; 

  TTimeDelayManager = class(TComponent) 
  private 
    FHardTime: Boolean; 
    FDelay: LongWord; 
    FTimerThread: TTimerThread; 
    FOnTimer: TNotifyEvent; 
    procedure WaitPlease; 
  public 
    constructor Create(AOwner: TComponent); override; 
    procedure Start; 
    procedure StartAsThread; 
  published 
    property Delay: LongWord read FDelay write FDelay; 
    property HardTime: Boolean read FHardTime write FHardTime; 
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer; 
  end; 

procedure Register; 

implementation 

procedure Register; 
begin 
  RegisterComponents('Samples', [TTimeDelayManager]); 
end; 

{ TTimeDelayManager } 

constructor TTimeDelayManager.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  FDelay := 1000; 
  FHardTime := False; 
end; 

procedure TTimeDelayManager.WaitPlease; 
var 
  Frequency, EndTime, CurrentTime, WaitTime: Int64; 
begin 
  QueryPerformanceFrequency(Frequency); 
  WaitTime := Trunc((Frequency / 1000) * FDelay); 
  QueryPerformanceCounter(EndTime); 
  EndTime := EndTime + WaitTime; 
  repeat 
    if not FHardTime then 
      Application.ProcessMessages; 
    QueryPerformanceCounter(CurrentTime) 
  until (CurrentTime >= EndTime); 
end; 

procedure TTimeDelayManager.Start; 
begin 
  WaitPlease; 
  if Assigned(FOnTimer) then 
    FOnTimer(Self); 
end; 

procedure TTimeDelayManager.StartAsThread; 
begin 
  TTimerThread.Create(False, Self); 
end; 

{ TTimerThread } 

constructor TTimerThread.Create(CreateSuspended: Boolean; AOwner: TTimeDelayManager); 
begin 
  inherited Create(CreateSuspended); 
  FOwner := AOwner; 
end; 

procedure TTimerThread.Execute; 
begin 
  FOwner.WaitPlease; 
  Synchronize(DoUserEvent); 
end; 

procedure TTimerThread.DoUserEvent; 
begin 
  if Assigned(FOwner.FOnTimer) then 
    FOwner.FOnTimer(FOwner); 
end; 

end.
Big_Eugen
Сообщений: n/a
30.03.2013, 17:10     Задержка в микроседундах #19
В C++ Builder'е задержку можно реализовать несколькими способами:
1. функция sleep() - приостанавливает программу на целое число секунд (подключаемая библиотека dos.h);
2. функция delay() - приостанавливает программу на целое число милисекунд. Работает только в Borland C++ 3.1 (подключаемая библиотека dos.h);
3. функция Sleep() - приостанавливает программу на целое число милисекунд (подключается заголовочным файлом windows.h). Работает как в консольных приложениях, так и в приложениях с формами.
4. и самый интересный вариант, самописная не документированная конструкция:

int time=GetTickCount();
while((GetTickCount()-time)<1000) // 1000 - число милисекунд задержки
{ }


Источник: Недоблог быдокодера
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 17:44     Задержка в микроседундах
Еще ссылки по теме:

Задержка в цикле на С - C++
Доброго времени суток! Подскажите как в консольном Борланде на С сделать пацзц в цикле, что бы выводимая информация была читабельна?

Задержка выполнения программы - C++
Ребята, помогите найти проблему плз.. Дело в том, что при запуске программы она висит 20 сек, и только потом передается управление...

Задержка командной строки - C++
При нажатии кнопки на форме Билдера открывается командная строка, пингует айпишник и тут же закрывается. Как мне ее задержать, чтобы я...

Задержка в программе (не API) - C++
Как сделать задержку в программе на VC++ 6.0. Не API функцией.

Задержка в одну секунду - C++
Как сделать в Си задержку в одну секунду?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.03.2013, 17:44     Задержка в микроседундах #20
А что никто не упоминает о chrono?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <thread>
#include <chrono>
 
int main() 
{
    //задержка на 50 микросекунд
    std::this_thread::sleep_for(std::chrono::microseconds(50));
    //задержка на 100 миллисекунд
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    
    return 0;
}
Добавлено через 2 минуты

Не по теме:

не увидел что тема давняя, тогда наверное chrono еще не было

Yandex
Объявления
30.03.2013, 17:44     Задержка в микроседундах
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru