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

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

14.01.2009, 19:55. Показов 76619. Ответов 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
684 / 233 / 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
684 / 233 / 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
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru