Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
171 / 61 / 11
Регистрация: 22.12.2015
Сообщений: 2,311
1

Как организовать задержку в мсек в функции, которая выполняется в непрерывном цикле таймера?

07.10.2018, 11:11. Просмотров 970. Ответов 2
Метки нет (Все метки)

Всем здравствуйте.

В непрерывном цикле таймера крутится некоторая функция.
C++
1
2
3
4
5
6
7
8
9
10
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    Timer1->Interval = 500;
}
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    RunTime1(10);
    RunTime2(5000);
}
Необходимо чтобы она полностью выполнилась, например, только через 5 секунд после старта таймера.
Все необходимые переменные должны находится внутри тела функции.
Если знать значение свойства таймера Interval (=500 мс) нетрудно подсчитать,
что 5 секунд пройдёт через 10 циклов. Это самый простой вариант.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void RunTime1(int DelayInCycles)        // Задержка в циклах
{
    static int delay;
    if (delay < DelayInCycles)
    {
        delay++;
        Form1->Label1->Caption = "Задерживаем продолжение выполнения функции на " + IntToStr(delay) + " цикл";
        return;
    }
    Form1->Label1->Caption = " Задержка закончилась, функция выполняется полностью";
    // В дальнейшем delay может быть сброшен в 0 для повторения отсчёта задержки
}
А если Interval таймера переменная величина? Да и удобнее в качестве параметра функции указывать миллисекунды задержки, а не количество циклов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void RunTime2(int DelayInMiSecond)      // Задержка в миллисекундах
{
    static DWORD end;
    static DWORD current;
    static bool f;
    current = GetTickCount();
    if (!f)
    {
        end = current + DelayInMiSecond;
        f = true;
    }
    if (current < end)
    {
        Form1->Label2->Caption = "Задерживаем продолжение выполнения функции на " + IntToStr(end - current) + " миллисекунд";
        return;
    }
    Form1->Label2->Caption = " Задержка закончилась, функция выполняется полностью";
    // В дальнейшем f может быть сброшен в false для повторения отсчёта задержки
}
Компьютер работает непрерывно, месяцами. Реальная частота работы таймера 150-200 мсек. Пугает частый вызов функции GetTickCount. В хелпе предупреждают, что время обернётся через ноль, если Windows выполняется непрерывно в течение 49,7 дней. Может есть у кого другие варианты решения данной задачи?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2018, 11:11
Ответы с готовыми решениями:

Как организовать задержку в 5 мс, которая не занимает ресурсы процессора?
Мне надо организовать задержку в 5 мс, которая не занимает ресурсы процессора. После долгих...

Максимальное ожидание таймера 65500 мсек, как увеличить?
Макс-ое ожидание таймера 65500 мсек,как увеличить? 65500-это примерно минута,а если я хочу чтоб...

Есть ли в Дельфи функция типа таймера, которая может задавать задержку с точностью до микросекунд?
Есть ли в дельфи функция типа таймера которая может задавать задержку с точностью до микросек.

Как убрать задержку таймера
Каким образом можно сделать так, чтобы делегат у таймера начинал работать сразу, а не через время,...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29731 / 19554 / 7665
Регистрация: 22.10.2011
Сообщений: 34,106
Записей в блоге: 6
07.10.2018, 11:26 2
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
В хелпе предупреждают, что время обернётся через ноль, если Windows выполняется непрерывно в течение 49,7 дней
Кроме этого, в хелпе (у Microsoft-а, т.е., в MSDN) написано:
To avoid this problem, use the GetTickCount64 function
Я надеюсь, аптайма Windows в 584 миллиона лет достаточно, чтобы не заботиться о переполнении?
2
51 / 39 / 15
Регистрация: 20.09.2018
Сообщений: 163
08.10.2018, 10:35 3
Так не пойдет?
C++
1
2
3
4
5
6
static TDateTime start=Now();
TDateTime end;
 
end=Now();
If(MilliSecondsBetween(start,end)>=5000)
         do_something();
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2018, 10:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как организовать задержку в UserControl
Добрый день! Я новичок в C# помогите решить проблемку. Я создаю собственный Control унаследованный...

Как организовать задержку в приведенном коде
Подскажите пожалуйста как организовать задержку в таком коде: CSEG segment org 100h Begin: ...

Как организовать задержку между созданием динамических кнопок?
Здравствуйте! Я новичок в C++ Прошу подсказать как можно организовать задержку 1 сек между...

Как сделать, чтобы ОС не прерывала выполнение функции, которая выполняется долго
Сортировка с отображением этого процесса в окне. Примерно через пять секунд программа виснет,...

Дождать выполнения функции которая выполняется в другой функции JavaScript
Добрый день. Мне нужно выполнить ajax функцию в другой функции. сейчас я это реализовал как :...

Организовать задержку
Добрый день! Написал тут программу, которая имитирует мигание светодиодом, нужно было сделать...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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