IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Не точная работа таймера ?
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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

ps нужна именно такая реализация: Интервал таймера очень маленький, в обработке таймера проверяется, если время, прошедшее от начала работы таймера делится на определенное число, необходимо произвести некоторые действия.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

start_time: Cardinal;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Interval := 1;
Timer1.Enabled := true;
start_time := GetTickCount;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
_now: Cardinal;
begin
_now := GetTickCount;

if (_now - start_time) mod 1000 = 0 then
Form1.Caption := IntToStr(_now - start_time);
end;

end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


У меня нормально отработал... (проверяла по системным часам и секундомеру на телефоне)
А в чем некорректность выражается?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Попробуй работать с QueryPerformanceCounter + TIME_CRITICAL для таких маленьких интервалов...

Добавлено через 2 мин.
Цитата
А в чем некорректность выражается?
По-моему, через какое-то время приведенный код начинает обгонять реальное время, или мне просто показалось?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


У меня этот код обновляет кепш только каждые 7 секунд, то есть отображается 7000, потом 14000 ....


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


добавление Refresh что-то изменит?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


TTimer - дико неточная вещь. Он работает через сообщения винды и потому его нельзя использовать на малых интервалов.
Для этого лучше создавать собственный thread и циклически вызывать Sleep(). Кроме того есть системные функции для таймеров высокой точности, но они тоже работают через нити.

Кстати, системные вызовы, навроде GetTickCount чертовски дороги (генерируют прерывание и вызывают переключение на ядро ОС). Почему изначально не поставить таймер на нужную задержку?

Сообщение отредактировано: hardcase -


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
Почему изначально не поставить таймер на нужную задержку?


Все немного сложнее. Грубо говоря, в событии таймера нужно было проверять на какие из N чисел, время прошедшее от старта таймера до текущего делится без остатка.

Всеравно всем спасибо. не стал я морочиться с этим гемором, решил немного по другому все сделать.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.11.2020 7:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name