Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2009, 15:09   #1
evgengold
 
Регистрация: 15.01.2009
Сообщений: 5
По умолчанию Как реализовать точный таймер (до мксек)

Есть ли в дельфи функция типа таймера которая может задавать задержку с точностью до микросек.
evgengold вне форума Ответить с цитированием
Старый 16.01.2009, 15:14   #2
Google[Bot]
Пользователь
 
Аватар для Google[Bot]
 
Регистрация: 09.01.2009
Сообщений: 65
По умолчанию

sleep(x:milliseconds);
Google[Bot] вне форума Ответить с цитированием
Старый 16.01.2009, 15:17   #3
evgengold
 
Регистрация: 15.01.2009
Сообщений: 5
По умолчанию

Нет в милисек не пойдет нужно в микросек
evgengold вне форума Ответить с цитированием
Старый 16.01.2009, 15:45   #4
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

в делфи есть
Код:
uses mmsystem;
timeSetEvent()
он хоть точный (точнее sleep и SetTimer) но у него всеравно в милисекундах задается интервал
а зачем точность до микросекунд?

да и врятли ты гдето подобное найдеш ибо сама система такого не имеет (тут должна пойти большая лекция про многопоточные системы, что они выполняют не вреальном времени потоки, про кванты и подобную лабуду)

Последний раз редактировалось Stilet; 02.03.2009 в 11:26.
ViktorXP вне форума Ответить с цитированием
Старый 16.01.2009, 16:10   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот что есть у меня в DFaq:
Цитата:
Скорость работы процессора, точный таймер

Данная тема уже обсуждалась, но у меня есть своя реализация сабжа. Начиная с Pentium MMX, Intel ввели в процессор счетчик тактов на 64 бита (Присутствуэт точно и в К6). Для того чтобы посотреть на его содержание, была введена команда "rdtsc" (подробное описание в интеловской мануале). Эту возможность можно использовать для реализации сабжа.
Посоку Делфя не вкурсе насчет rdtsc, то пришлось юзать опкод (0F31).
Привожу простенький примерчик юзания, Вы уж извините - немножко кривоват получился, да и ошибка компилера какая-то вылезала (V4 Bld5.104 Upd 2). Кому интересно, поделитесь своими соображениями по этому поводу. Особенно интерисует работа в режиме когда меняется частота процессора (Duty Cycle, StandBy).

Проверялось под еНТями.
// (C) 1999 ISV
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms,
Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Timer1: TTimer;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
Label4: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Counter:integer; //Счетчик срабатывания таймера
Start:int64; //Начало роботы
Previous:int64; //Предыдущее значение
PStart,PStop:int64; //Для примера выч. времени
CurRate:integer; //Текущая частота
проца
function GetCPUClick:int64;
function GetTime(Start,Stop:int64)ouble;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Функция работает на пнях ММХ или выше а
// также проверялась на К6
function TForm1.GetCPUClick:int64;
begin
asm
db 0fh,31h // Опкод для команды rdtsc
mov dword ptr result,eax
mov dword ptr result[4],edx
end;
// Не смешно . Без ?той штуки
// Компайлер выдает Internal error C1079
Result:=Result;
end;
// Время в секундах между старт и стоп
function TForm1.GetTime(Start,Stop:int64)o uble;
begin
try
result:=(Stop-Start)/CurRate
except
result:=0;
end;
end;
// Обработчик
таймера считает текущую частоту, выводит ее, а также
// усредненную частоту, текущий такт с момента старта процессора.
// При постоянной частоте процессора желательно интервал брать
побольше
// 1-5с для точного прощета частоты процессора.
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:int64;
begin
i:=GetCPUClick;
if Counter=0
then Start:=i
else begin
Label2.Caption:=Format('Частота общая:
%2f',[(i-Start)/(Counter*Timer1.Interval*1000)]);
Label3.Caption:=Format('Частота текущая:
%2f',[(i-Previous)/(Timer1.Interval*1000)]);
CurRate:=Round(((i-Previous)*1000)/(Timer1.Interval));
end;
Label1.Caption:='Такты: '+IntToStr(i);
Previous:=i;
Inc(Counter);
end;
procedure TForm1.FormActivate(Sender:
TObject);
begin
Counter:=0;
end;
// Заносим стартовое время для примера
procedure TForm1.Button1Click(Sender: TObject);
begin
PStart:=GetCPUClick;
end;
// Останавливаем отсчет времени и показуем соко
// прошло секунд
procedure TForm1.Button2Click(Sender: TObject);
begin
PStop:=GetCPUClick;
Label4.Caption:=Format('Время между нажатиями:
%gсек',[GetTime(PStart,PStop)])
end;
end.
Это - не мое. Когда-то где-то попалось на глаза...
Сам не проверял, так что не обессудьте. Но может, как минимум натолкнет на здравую мысль?
mihali4 вне форума Ответить с цитированием
Старый 18.01.2009, 02:36   #6
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

тут читаю книгу Рихтера (автор потрясный) и наткнулся на таймер который как ни кстате вписывается в эту ситуину. хотя у него больше возможностей но напишу только под эту ситуину пример

Код:
var
  hTim: THandle;
  DueTime: Int64;
begin
  hTim := CreateWaitableTimer(nil, false, nil);// создаем таймер
  DueTime := -10000000;// задаем время (об этом ниже)
  SetWaitableTimer(hTim, DueTime, 0, nil,nil,false); // задаем настройки
  WaitForSingleObjectEx(hTim, infinite, true);// ждем 
  ShowMessage('Прошла одна секунда');
в DueTime интервал задается со знаком минуса и по такому принцыпу
1 с = 1000 мс = 1000 000 мс = 10 000 000 раза по 100 нс

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

пс. за подробностями либо к рихтеру либо в мсдн

Последний раз редактировалось ViktorXP; 18.01.2009 в 02:40.
ViktorXP вне форума Ответить с цитированием
Старый 02.03.2009, 11:19   #7
alexalexmart
Новичок
Джуниор
 
Регистрация: 02.03.2009
Сообщений: 2
По умолчанию

о какой книге идет речь? ссылку или хотя-бы название бы
alexalexmart вне форума Ответить с цитированием
Старый 02.03.2009, 11:50   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Я сильно сомневаюсь что винда позволяет отмерять время с такой точностью, разве только если приоритет TimeCritical и где-то в ядре
пыщь
JTG вне форума Ответить с цитированием
Старый 02.03.2009, 13:18   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

помоему минимальная отметка времени это один Тик процессора
и помоему до микросекунд там не доберешься
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.03.2009, 20:29   #10
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Цитата:
о какой книге идет речь? ссылку или хотя-бы название бы
http://www.sprinter.ru/books/1797311.html

Цитата:
помоему минимальная отметка времени это один Тик процессора
и помоему до микросекунд там не доберешься
так то оно так. но нужно учесть что очень мало опкодных команд которые выполняются за один такт, некоторые команды могут отнимать не одну сотню тактов.
а теперь нужно учесть что нужно както проверить что таймер сработал.
да и нужно ведь както отследить что время изменилось.
а если еще учесть что винда мультитрейдная среда то она постоянно перемищает потоки вы деляя каждому по кванту.
я чесноговоря не знаю как этот таймер создан но логически предположить можно что вслучае срабатывания винда внеочереди передает ему ручку. если же она просто включит его в очередь (как и все другие таймеры) то за точность никто ручатся не будет. но отследить мы этого не можем. хотя....
ViktorXP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить точный таймер WaxeP Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 25.07.2010 18:25
Как такое реализовать? AnalogXP Общие вопросы Delphi 9 17.02.2008 00:22
Как вставить таймер в программу если нет формы durexa Помощь студентам 9 25.06.2007 13:13
Как сделать что-бы Таймер срабатывал только один раз? Greg Компоненты Delphi 11 16.12.2006 01:25
Как засинхронизировать таймер с частотой кадровой развертки монитора Saili Общие вопросы Delphi 2 07.12.2006 16:35