Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как написать будильник с точночтью до мсек 
:(
    Опции темы
Rakhim
Дата 3.2.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.8.2004

Репутация: нет
Всего: нет



Мне нужно чтобы с точностью до мсек запускалась программа(производились определённые действия), как реализовать это.
PM MAIL   Вверх
Pakshin A. S.
Дата 3.2.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



А стандартный таймер не подходит? Interval = 1. Запускаем его, когда пришло время, то запукаем либо действие, либо прогу....
PM   Вверх
доброжелатель
Дата 3.2.2005, 17:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











вот гад и действительно секунды просто так не выводит. Моё решение:

Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
h,m,s,ms:word;
begin
decodetime(time,h,m,s,ms);
caption:=timetostr(time)+':'+inttostr(ms);
end;

end.

  Вверх
nickelfire
Дата 3.2.2005, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 22.12.2004

Репутация: нет
Всего: нет



А может попробовать с помощью On_idle.
PM MAIL   Вверх
legwar
Дата 3.2.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 24.12.2004
Где: Москва

Репутация: нет
Всего: нет



посмотри в demo в delphi 7.0 там есть пример секундомера
PM MAIL ICQ   Вверх
Rakhim
Дата 4.2.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.8.2004

Репутация: нет
Всего: нет



Цитата(Pakshin @ 3.2.2005, 19:36)
А стандартный таймер не подходит? Interval = 1. Запускаем его, когда пришло время, то запукаем либо действие, либо прогу....


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

Код на таймере:
Код

 DecodeTime(Time, Hour, Min, Sec, MSec);
 Application.ProcessMessages;
 pnTime.Caption:= IntToStr(Hour) + ':' + IntToStr(Min)+ ':'
   + IntToStr(Sec)+ ':' + IntToStr(MSec);
//  ListBox1.Items.Add(IntToStr(MSec));
 if (Hour=seHour.Value) and (Min=seMin.Value) and (Sec=seSec.Value) and
   (MSec=seMSec.Value) then
   StatusBar1.Panels[0].Text:='111'


И влияют ли таймеры друг на друга, у второго тайемера интервал гораздо больше. smile
PM MAIL   Вверх
Akella
Дата 4.2.2005, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

Код

unit Unit1;interfaceuses  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):double;
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):double;
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.Cap примера
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.


PM MAIL   Вверх
Rakhim
Дата 4.2.2005, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.8.2004

Репутация: нет
Всего: нет



Цитата(nickelfire @ 3.2.2005, 22:13)
А может попробовать с помощью On_idle


А по подробнее можно smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.