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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2008, 22:02   #31
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Он не в Делфи - это api функция windows из библиотеки winmm.dll, а модуль MMSystem - это интерфейсный модуль к этой библиотеке.
_Dmitry вне форума Ответить с цитированием
Старый 07.01.2008, 22:42   #32
chingiz
Пользователь Подтвердите свой е-майл
 
Аватар для chingiz
 
Регистрация: 21.05.2007
Сообщений: 88
По умолчанию

Цитата:
Сообщение от _Dmitry Посмотреть сообщение
Мультимедийный таймер: Если обработчик таймера не успевает закончить все действия в установленный интервал, то последующие вызовы накапливаться не будут. Сама же CallBack функция вызывается в контексте отдельного потока.
Интересно а почему так происходит, почему винда ставит ММтаймер вне очереди? А если к примеру я захочу чтобы моя прога (не обязательно про которую я писал раннее) обрабатывалась также как ММтаймер поперед паровоза я могу это задать средствами Делфи или API?
Уже Чему-то научился Но этого мало
chingiz вне форума Ответить с цитированием
Старый 08.01.2008, 12:02   #33
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Чего-то я сильно сомневаюсь, чтобы винда что-то пропускала вне очереди. Если обработчик таймера не успевает закончить все действия в установленный интервал, то, скорее всего, следующий вызов обработчика в мультимедийном таймере просто не будет выполнен, а в системном - встанет в очередь. Хотя в этом уверенности нет, нужно тестировать или читать тех. описание.
_Dmitry вне форума Ответить с цитированием
Старый 09.01.2008, 21:28   #34
chingiz
Пользователь Подтвердите свой е-майл
 
Аватар для chingiz
 
Регистрация: 21.05.2007
Сообщений: 88
По умолчанию

Тестировал ММтаймер так почемуто очень часто система выдает примерно такие ошибки в чем дело?
Вложения
Тип файла: zip irror.zip (31.0 Кб, 24 просмотров)
Уже Чему-то научился Но этого мало
chingiz вне форума Ответить с цитированием
Старый 09.01.2008, 22:26   #35
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от chingiz Посмотреть сообщение
Я так и предполагал что первый ответ будет именно про таймер. В том то вся проблема что таймер меня не устраивает. Мне надо выполнить процедуру 10000 раз за секунду, или хотя бы на крайний случай 1000 раз в секунду а таймер уже при значении Timer.interval = 100 отстает от реального времени, я уж не говорю про Timer.interval = 1, разницы почти никакой.
Я не могу понять причем тут отстования таймера если ты говоришь что тебе надо в секунду а пишешь об отставании Timer.interval = 100 и
Timer.interval = 1

Timer.interval = 100 - это одна 10 секунды
Timer.interval = 1 - это одна тысячная секунды

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

Последний раз редактировалось Stanislav; 09.01.2008 в 22:34.
Stanislav вне форума Ответить с цитированием
Старый 10.01.2008, 18:09   #36
chingiz
Пользователь Подтвердите свой е-майл
 
Аватар для chingiz
 
Регистрация: 21.05.2007
Сообщений: 88
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
Я не могу понять причем тут отстования таймера если ты говоришь что тебе надо в секунду а пишешь об отставании Timer.interval = 100 и
Timer.interval = 1

Timer.interval = 100 - это одна 10 секунды
Timer.interval = 1 - это одна тысячная секунды
Я могу написать:
1000 раз в секунду
100 раз за 1/10 секунды
10 раз за 1/100 секунды
1 раз за 1/1000 секунды
Разницы между этими четырьмя записями никакой. Главное чтоб периодичность выполнения какой либо процедуры соответствовала заданной мной. Можно почитать предыдущие сообщения.

Цитата:
Сообщение от Stanislav Посмотреть сообщение
мне тока это не понятно....
Если все остальное тебе понятно то как сделать чтоб я мог запустить свою процедуру один раз за 1/1000 секунды, да так чтоб между запусками процедуры реально прошло именно 1/1000 секунды.
Уже Чему-то научился Но этого мало
chingiz вне форума Ответить с цитированием
Старый 10.01.2008, 20:11   #37
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от chingiz Посмотреть сообщение
Я могу написать:
1000 раз в секунду
100 раз за 1/10 секунды
10 раз за 1/100 секунды
1 раз за 1/1000 секунды
Разницы между этими четырьмя записями никакой. Главное чтоб периодичность выполнения какой либо процедуры соответствовала заданной мной. Можно почитать предыдущие сообщения.



Если все остальное тебе понятно то как сделать чтоб я мог запустить свою процедуру один раз за 1/1000 секунды, да так чтоб между запусками процедуры реально прошло именно 1/1000 секунды.

Я написал что мне непонятно только это... ну это не значит что я знаю как решить эту проблему ..... единственное что только могу сказать видел статью помойму в delphiworld про высокотонный таймер.....

и еще одну статью....

Код:
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):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.
А вообще как писал Карась проблему можно решить с помощью электроники......
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 10.01.2008 в 20:25.
Stanislav вне форума Ответить с цитированием
Старый 03.10.2012, 11:33   #38
Pipisulka
Новичок
Джуниор
 
Регистрация: 25.10.2010
Сообщений: 1
По умолчанию

Цитата:
Сообщение от _Dmitry Посмотреть сообщение
Я ведь давал ссылку на мультимедийный таймер, тестируйте, работает намного корректнее дельфийского

Здесь подробнее http://decoding.narod.ru/api/mmtimer/mmtimer.html

Обратите внимание на разницу:
Системный таймер: Если обработчик таймера не успевает закончить все действия в установленный интервал, то последующие вызовы этого обработчика становятся в очередь. Это приводит к тому, что на разных компьютерах приложение работает с разной скоростью. Сама же CallBack функция вызывается в контексте основного потока.
Мультимедийный таймер: Если обработчик таймера не успевает закончить все действия в установленный интервал, то последующие вызовы накапливаться не будут. Сама же CallBack функция вызывается в контексте отдельного потока.
Спасибо, очень выручили!
Pipisulka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение функции nikleb JavaScript, Ajax 7 10.08.2008 01:49
указатель мыши автоматически должен совершать клик по заданному месту на экране, через промежуток времени Deefrost Qt и кроссплатформенное программирование С/С++ 5 16.05.2008 20:25
Как зделать авто выполнение Editor Общие вопросы Delphi 5 27.04.2008 21:01
Выполнение действия с компонентами в цикле Ermiss Общие вопросы Delphi 4 01.11.2007 23:54
Выполнение действия в заданное время WOWan234 Помощь студентам 6 02.05.2007 01:52