Timer->Interval
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?
Может просто комп не успевает так быстро? Что за специфическая задача?
Может лучше будет обойтись отдельным потоком?
Может просто комп не успевает так быстро? Что за специфическая задача?
Может лучше будет обойтись отдельным потоком?
Кстати, я тоже оччень интересуюсь данным вопросом... Как вообще можно замерять интервалы меньшие, чем такт таймера?
Т.к. даже поток не удается "торомознуть" на время, меньшее времени этого такта. А вешать в поток "бесконечный цикл" - тоже идея не из лучших - сразу систему грузанешь.
... В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?
А 1 в Timer->Interval это разве не 0,001 сек ???!!! Что заставило тебя в этом усомниться?Напиши, пожалуйста, поподробнее..
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?
Сообщения, генерируемые таймером ставятся в очередь сообщений, и обрабатываются тогда, когда прийдет их очередь. Поэтому даже 0,001 сек - достаточно приблизительный параметр. Для повышения скорости обработки сообщений используй PeekMessage().
Эта функция отискивает в очереди сообщений зарегистрированное сообщение и отправляет его в оконную процедуру в первую очередь (типа льготника :D).
Кстати, я тоже оччень интересуюсь данным вопросом... Как вообще можно замерять интервалы меньшие, чем такт таймера?
Т.к. даже поток не удается "торомознуть" на время, меньшее времени этого такта. А вешать в поток "бесконечный цикл" - тоже идея не из лучших - сразу систему грузанешь.
Почти любой поток, Любой программы работает в бесконечном цикле, и это совершненно нормально.
Как раз таки таймер тормозит систему много более, так как постоянно приходится системе генерировать сообщение таймера, а программе получать и перескакивать на обработчик таймера.
Почти любой поток, Любой программы работает в бесконечном цикле, и это совершненно нормально.
Как раз таки таймер тормозит систему много более, так как постоянно приходится системе генерировать сообщение таймера, а программе получать и перескакивать на обработчик таймера.
Боб, ты ПОЧТИ прав, но вся и соль в этом ПОЧТИ... Чтобы это понять нужно покапаться в том, как система распределяет тайминги между задачами... да плюс ко всему в этом "бесконечном" цикле за частую используется не только процессор, а и др. устройства, во время работы которых проц "отдыхает"(т.е. свободен, для выполнения других задач)... Полная загрузка проца будет только если зациклишь чисто математическу операцию.
Простой пример: Запути какую-нить игру с отображением ФПС (или любую прогу, которая будет измерять реалтайм скорость своего выполнения, только приоритет не должна завышать), и параллельно ей открой окошко проводника. ФПС в игре сильно снизится? А теперь вместо проводника запусти прогу со, скажем, бесконечным циклом увеличения числа на 1. Как ФПС?
Это во-первых. А во-вторых: если ставишь в таймере число менее такта сис.таймера, то срабатывание все равно идет периодами сис.таймера. По моему опыту это число в зависимости от материнки колеблется между 10-25 мс, что в переводе на частоту означает всего 40-100 операций в секунду. А если некую небольшую операцию зациклить без таймера да на 3 ГГц процессоре, то получишь несколько десятков миллионов операций в секунду - а это зачастую не нать... Да и проц юзерский вгрузишь по самое не балуйся!
В общем: есть кто знающий, как запустить некий цикл с частотой скажем 0,1 мс ? Чтоб он выполнил действие, и не начинал новое до тех пор пока не пройдут очередные 0,1 мс.
Она освобождает оставшееся время, которая система выделяла потоку.
Есть потрясающая команда Sleep(0)
Она освобождает оставшееся время, которая система выделяла потоку.
Она действительно потрясная. Но таки поставленную задачу (ожидание 0,1 мс) не выполняет... Она только немного снижает "монополию" зацикленной задачи.
Я пишу програму на BorlandC++Builder.Там использую Тimer.Мне нужно,чтоби некоторий код виполнялса с каким-то интервалом.В свойстве Interval таймера я ставлю 1,но етого недостаточно.Как мне сделать так чтоби интервал бил например 0,001 сек ?
Минимальный предел интервала TTimer равен 55 мс. Если тебе нужно еще меньше, то ищи какой-то другой компонент.
Минимальный предел интервала TTimer равен 55 мс. Если тебе нужно еще меньше, то ищи какой-то другой компонент.
что-то я ничего не понял...как это так ты высчитал? почему именно 55мс(миллисекунд???) ?
что-то я ничего не понял...как это так ты высчитал? почему именно 55мс(миллисекунд???) ?
Извиняюсь, ошибся :{ минимум 1мс :P
Извиняюсь, ошибся :{ минимум 1мс :P
1 мс - это, то что можно записать, а на самом деле меньше 10 мс. стандартными средствами не получить.
Можно попробовать CreateWaitableTimer, но ИМХО это тоже не совсем выход.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=434
.
Насколько мне известно, то мультумедийные таймеры более "точны", так-что можно попробовать timeSetEvent.
Минутный поиск в Гугле дал вот такой результат:
A(VK): Использовать Performance Counter.
Функцией QueryPerformanceFrequency получаем частоту счётчика,
которая, как правило, выше 1Мгц, создаём отдельный поток и в цикле
функцией QueryPerformanceCounter считываем его значение.
Практически, на P200 достаточно точно определяются интервалы в 20 мкс.
Так что дерзайте ;) Всё в ваших руках.
PS:
Приколист...
Так что дерзайте ;) Всё в ваших руках.
Класс!!! Эта штука засекает чертовски точно!
Мой проверочный примерчик:
{
_LARGE_INTEGER fr,c,c1;
QueryPerformanceFrequency(&fr);
QueryPerformanceCounter(&c);
Sleep(1000);
QueryPerformanceCounter(&c1);
Caption = (double)(c1.QuadPart-c.QuadPart)/fr.QuadPart;
}
Люди, а есть еще у кого идеи, как заставить некий поток ЖДАТЬ появления некоторого числа в этом коунтере?
Т.е. мне очень нужно что-то типа:
QueryPerformanceFrequency(&fr);
QueryPerformanceCounter(&c);
c1.QuadPart = c.QuadPart + fr.QuadPart/20000; // 1/20 милисекунды
WaitFor(c1);//Надо чтоб здесь функция подождала наступления(или превышения) в коунтере числа с1;
**********************************
//
**********************************
}
Вообще в Винде мало ждущих функций..
может WaitForSingleObject подойдёт ?
Что-то не совсем понял, что именно надо получить... Чем Sleep не подходит?
Вообще в Винде мало ждущих функций..
может WaitForSingleObject подойдёт ?
Sleep - не может ждать менее 1 мс, да и то малые значения выдерживает оччень не точно (т.е. напишешь 1 мс, а ждать он на самом деле будет черт знает сколько...)
WaitForSingleObject - ...даже не знаю как ее сюда прикрутить... она может ожидать только объекты у которых в наличии "синхронайз" секция...
Иех... чувствую снова облом :)
WaitForSingleObject - ...даже не знаю как ее сюда прикрутить... она может ожидать только объекты у которых в наличии "синхронайз" секция...
Вообще то она наверно даст погрешность ещё больше чем Sleep... что-то сразу не подумал.
Иех... чувствую снова облом :)
Не вешай нос :)