Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/419: Рейтинг темы: голосов - 419, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5

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

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

Студворк — интернет-сервис помощи студентам
Подскажите,можно ли как-нибудь сделать задержку в 30-40 микросекунд?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2009, 19:55
Ответы с готовыми решениями:

While и задержка
Здравствуйте, если можно нужен быстрый ответ :) Есть цикл while, мне нужно что бы после каждой итерации в нём происходила задержка на 0.2...

Задержка :-)
Вот хочу помигать св.диодами, начало положено и становится все более ясней. Но вот возник вопрос - как ЛУЧШЕ, ЭФФЕКТИВНЕЙ, ЭКОНОМИЧНЕЙ...

Задержка
Здравствуйте! Имеется такой код: mov eax mov ,ebx Мне нужно сделать задержку на 1 секунду перед записью регистра ebx в адрес...

20
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
14.01.2009, 20:33
C++
1
2
3
4
5
#include <windows.h>
int main(){
Sleep(40);
return 0;
}
1
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
14.01.2009, 20:40  [ТС]
Цитата Сообщение от Mecid Посмотреть сообщение
C++
1
2
3
4
5
#include <windows.h>
int main(){
Sleep(40);
return 0;
}
Это задержка в 40 МИЛЛИсекунд,нада в МИКРОсекундах.
0
32 / 32 / 4
Регистрация: 29.12.2008
Сообщений: 75
14.01.2009, 20:42
При программировании в 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 милисекунд), произойдет выход из цикла.
0
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
14.01.2009, 20:50  [ТС]
Ну дык это тоже МИЛЛИсекунды.
0
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
14.01.2009, 21:18
для нано и микро секундных задержек используется либо мультимедиа таймер из winmm, либо ассемблерная инструкция rdtsc (количество тиков).
если нужно позже прикреплю модули для калибровки и задержек этими способами
0
32 / 32 / 4
Регистрация: 29.12.2008
Сообщений: 75
14.01.2009, 21:28
При программировании в Windows столь короткие задаржки ты никогда не сделаешь. Там даже таймеры рекомендуют для большой точности брать с интервалом в 2 секунды (не меньше), хотя документально они обеспечивают милисекундную точность.

Если работаешь напрямую с процессором (на ассемблере), старайся считать количество тактов, затраченное навыполнение какой-то конкретной операции. Иного пути я не знаю.
0
0 / 0 / 0
Регистрация: 28.12.2008
Сообщений: 5
14.01.2009, 21:31  [ТС]
Понял,спасибо,буду думать как обойтись без задержек.
0
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
14.01.2009, 21:48
нормально все реализуется нечего глупости говорить.
например у Щупака в книге все отлично описано
0
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
15.01.2009, 11:38
см. вложение
Вложения
Тип файла: rar timers.rar (47.4 Кб, 1185 просмотров)
2
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
16.01.2009, 18:05
Можно использовать заднржку милисекунду,микро даже не даст результат
0
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
16.01.2009, 19:05
2Mecid
никаких проблем
во вложений модули позволяют делать микро задержки
0
32 / 32 / 4
Регистрация: 29.12.2008
Сообщений: 75
16.01.2009, 20:11
Очень не хотелось бы, чтобы мой вопрос выглядел как провокационный, но все же.

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

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

P.S.
Я уже рассказывал о таймерах, которые считают с точностью до милисекунд, но на практике минимальный интервал, который имеет смысл задавать для них - это полсекунды, а самая лучшая синхронизация с реальным временем достигается, когда их интервал равен 1 - 2 секундам (в зависимости от количества одновременно выполняющихся в Windows процессов).
1
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
16.01.2009, 21:32
при программировании спектрометра работал с ацп и шаговым двигателем практически в реальном времени (с высоким приоритетом) задержки после пересчета составляют даже менее 30 микро.
хотя, разумеется ввиду того что windows os не реального времени приходилось следить за загрузкой цп
пользовался схемой с использованием rdtsc
0
0 / 0 / 0
Регистрация: 22.01.2009
Сообщений: 6
23.01.2009, 18:16
посмотри https://www.cyberforum.ru/delp... l?posted=1
будем бороться вместе.

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

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

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

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

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

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

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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.
0
0 / 0 / 0
Регистрация: 20.06.2015
Сообщений: 2
30.03.2013, 17:10
В 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 - число милисекунд задержки
{ }


Источник: Недоблог быдокодера
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.03.2013, 17:44
А что никто не упоминает о 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 еще не было

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2013, 17:44
Помогаю со студенческими работами здесь

Задержка
Здравствуйте. Хочу поиграться с ШИМ, что б на COM порте светодиод плавно изменял интенсивность. Но вот не знаю как реализовать задержку в...

Задержка
Добрый всем день. После получения фокуса должен выполнится запрос.У меня наоборот запрос выскакивает быстрее фокуса. Подскажите выход...

Задержка
Здравствуйте, необходимо реализовать задержку между выполнением кода, при нажатии на button на picture box рисуется элипс в...

Задержка
Здраствуйте, возникла проблема при использовании 86h int 15h. По идеи с помощю этого прерывания должна происходить задержка, но почемуто...

Задержка
Как сделать задержку вывода символов, что символы выводились не разом, а к примеру через 1 секунду?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru