Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Timer->Interval

3.2K
04 декабря 2005 года
foldem
52 / / 24.10.2005
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?
299
04 декабря 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by foldem
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?

Может просто комп не успевает так быстро? Что за специфическая задача?
Может лучше будет обойтись отдельным потоком?

4.8K
04 декабря 2005 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by 3D Bob
Может просто комп не успевает так быстро? Что за специфическая задача?
Может лучше будет обойтись отдельным потоком?



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

Т.к. даже поток не удается "торомознуть" на время, меньшее времени этого такта. А вешать в поток "бесконечный цикл" - тоже идея не из лучших - сразу систему грузанешь.

1.9K
05 декабря 2005 года
Anton Chik
175 / / 26.09.2005
Цитата:
Originally posted by foldem
... В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?



А 1 в Timer->Interval это разве не 0,001 сек ???!!! Что заставило тебя в этом усомниться?Напиши, пожалуйста, поподробнее..

6.4K
05 декабря 2005 года
Host
122 / / 22.09.2005
Цитата:
Originally posted by foldem
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?



Сообщения, генерируемые таймером ставятся в очередь сообщений, и обрабатываются тогда, когда прийдет их очередь. Поэтому даже 0,001 сек - достаточно приблизительный параметр. Для повышения скорости обработки сообщений используй PeekMessage().
Эта функция отискивает в очереди сообщений зарегистрированное сообщение и отправляет его в оконную процедуру в первую очередь (типа льготника :D).

299
05 декабря 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Jump
Кстати, я тоже оччень интересуюсь данным вопросом... Как вообще можно замерять интервалы меньшие, чем такт таймера?

Т.к. даже поток не удается "торомознуть" на время, меньшее времени этого такта. А вешать в поток "бесконечный цикл" - тоже идея не из лучших - сразу систему грузанешь.


Почти любой поток, Любой программы работает в бесконечном цикле, и это совершненно нормально.
Как раз таки таймер тормозит систему много более, так как постоянно приходится системе генерировать сообщение таймера, а программе получать и перескакивать на обработчик таймера.

4.8K
05 декабря 2005 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by 3D Bob
Почти любой поток, Любой программы работает в бесконечном цикле, и это совершненно нормально.
Как раз таки таймер тормозит систему много более, так как постоянно приходится системе генерировать сообщение таймера, а программе получать и перескакивать на обработчик таймера.



Боб, ты ПОЧТИ прав, но вся и соль в этом ПОЧТИ... Чтобы это понять нужно покапаться в том, как система распределяет тайминги между задачами... да плюс ко всему в этом "бесконечном" цикле за частую используется не только процессор, а и др. устройства, во время работы которых проц "отдыхает"(т.е. свободен, для выполнения других задач)... Полная загрузка проца будет только если зациклишь чисто математическу операцию.

Простой пример: Запути какую-нить игру с отображением ФПС (или любую прогу, которая будет измерять реалтайм скорость своего выполнения, только приоритет не должна завышать), и параллельно ей открой окошко проводника. ФПС в игре сильно снизится? А теперь вместо проводника запусти прогу со, скажем, бесконечным циклом увеличения числа на 1. Как ФПС?

Это во-первых. А во-вторых: если ставишь в таймере число менее такта сис.таймера, то срабатывание все равно идет периодами сис.таймера. По моему опыту это число в зависимости от материнки колеблется между 10-25 мс, что в переводе на частоту означает всего 40-100 операций в секунду. А если некую небольшую операцию зациклить без таймера да на 3 ГГц процессоре, то получишь несколько десятков миллионов операций в секунду - а это зачастую не нать... Да и проц юзерский вгрузишь по самое не балуйся!

В общем: есть кто знающий, как запустить некий цикл с частотой скажем 0,1 мс ? Чтоб он выполнил действие, и не начинал новое до тех пор пока не пройдут очередные 0,1 мс.

299
05 декабря 2005 года
3D Bob
885 / / 18.04.2005
Есть потрясающая команда Sleep(0)
Она освобождает оставшееся время, которая система выделяла потоку.
4.8K
05 декабря 2005 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by 3D Bob
Есть потрясающая команда Sleep(0)
Она освобождает оставшееся время, которая система выделяла потоку.



Она действительно потрясная. Но таки поставленную задачу (ожидание 0,1 мс) не выполняет... Она только немного снижает "монополию" зацикленной задачи.

2.9K
08 декабря 2005 года
narcotic
41 / / 04.10.2004
Цитата:
Originally posted by foldem
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?


Минимальный предел интервала TTimer равен 55 мс. Если тебе нужно еще меньше, то ищи какой-то другой компонент.

1.9K
08 декабря 2005 года
Anton Chik
175 / / 26.09.2005
Цитата:
Originally posted by narcotic
Минимальный предел интервала TTimer равен 55 мс. Если тебе нужно еще меньше, то ищи какой-то другой компонент.



что-то я ничего не понял...как это так ты высчитал? почему именно 55мс(миллисекунд???) ?

2.9K
08 декабря 2005 года
narcotic
41 / / 04.10.2004
Цитата:
Originally posted by Anton Chik
что-то я ничего не понял...как это так ты высчитал? почему именно 55мс(миллисекунд???) ?


Извиняюсь, ошибся :{ минимум 1мс :P

1.9K
08 декабря 2005 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by narcotic
Извиняюсь, ошибся :{ минимум 1мс :P


1 мс - это, то что можно записать, а на самом деле меньше 10 мс. стандартными средствами не получить.
Можно попробовать CreateWaitableTimer, но ИМХО это тоже не совсем выход.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=434
.
Насколько мне известно, то мультумедийные таймеры более "точны", так-что можно попробовать timeSetEvent.
Минутный поиск в Гугле дал вот такой результат:

Цитата:
>Q40: Как сделать таймер с интервалом < 1 мс?

A(VK): Использовать Performance Counter.

Функцией QueryPerformanceFrequency получаем частоту счётчика,
которая, как правило, выше 1Мгц, создаём отдельный поток и в цикле
функцией QueryPerformanceCounter считываем его значение.

Практически, на P200 достаточно точно определяются интервалы в 20 мкс.


Так что дерзайте ;) Всё в ваших руках.

PS:

Цитата:
Минимальный предел интервала TTimer равен 55 мс. Если тебе нужно еще меньше, то ищи какой-то другой компонент.

Приколист...

4.8K
11 декабря 2005 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by mail0

Так что дерзайте ;) Всё в ваших руках.



Класс!!! Эта штука засекает чертовски точно!
Мой проверочный примерчик:

 
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    _LARGE_INTEGER fr,c,c1;

    QueryPerformanceFrequency(&fr);
    QueryPerformanceCounter(&c);
    Sleep(1000);
    QueryPerformanceCounter(&c1);
    Caption = (double)(c1.QuadPart-c.QuadPart)/fr.QuadPart;
}


Люди, а есть еще у кого идеи, как заставить некий поток ЖДАТЬ появления некоторого числа в этом коунтере?
Т.е. мне очень нужно что-то типа:
 
Код:
_LARGE_INTEGER fr,c,c1;

    QueryPerformanceFrequency(&fr);
    QueryPerformanceCounter(&c);
    c1.QuadPart = c.QuadPart + fr.QuadPart/20000; // 1/20 милисекунды
    WaitFor(c1);//Надо чтоб здесь функция подождала наступления(или превышения) в коунтере числа с1;
    **********************************
    //
    **********************************
}
1.9K
11 декабря 2005 года
mail0
137 / / 09.05.2005
Что-то не совсем понял, что именно надо получить... Чем Sleep не подходит?
Вообще в Винде мало ждущих функций..
может WaitForSingleObject подойдёт ?
4.8K
12 декабря 2005 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by mail0
Что-то не совсем понял, что именно надо получить... Чем Sleep не подходит?
Вообще в Винде мало ждущих функций..
может WaitForSingleObject подойдёт ?



Sleep - не может ждать менее 1 мс, да и то малые значения выдерживает оччень не точно (т.е. напишешь 1 мс, а ждать он на самом деле будет черт знает сколько...)

WaitForSingleObject - ...даже не знаю как ее сюда прикрутить... она может ожидать только объекты у которых в наличии "синхронайз" секция...

Иех... чувствую снова облом :)

1.9K
12 декабря 2005 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by Jump
WaitForSingleObject - ...даже не знаю как ее сюда прикрутить... она может ожидать только объекты у которых в наличии "синхронайз" секция...


Вообще то она наверно даст погрешность ещё больше чем Sleep... что-то сразу не подумал.

Цитата:
Originally posted by Jump
Иех... чувствую снова облом :)


Не вешай нос :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог