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

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

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

C++ Задержка экрана
задержка времени C++
Задержка и язык. C++
Задержка в цикле на С C++
C++ Задержка в приложении
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mecid
 Аватар для Mecid
678 / 227 / 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
Флудер
 Аватар для 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
Флудер
 Аватар для Ensase
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
14.01.2009, 21:48     Задержка в микроседундах #9
нормально все реализуется нечего глупости говорить.
например у Щупака в книге все отлично описано
Ensase
Флудер
 Аватар для Ensase
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
15.01.2009, 11:38     Задержка в микроседундах #10
см. вложение
Вложения
Тип файла: rar timers.rar (47.4 Кб, 1065 просмотров)
Mecid
 Аватар для Mecid
678 / 227 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
16.01.2009, 18:05     Задержка в микроседундах #11
Можно использовать заднржку милисекунду,микро даже не даст результат
Ensase
Флудер
 Аватар для 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
Флудер
 Аватар для 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
Флудер
 Аватар для 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++ C++
C++ Задержка времени

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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     Задержка в микроседундах
Ответ Создать тему
Опции темы

Текущее время: 08:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru