Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 27 • Страница 2 из 2<  1  2
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 24.06.2007
Откуда: Москва
аааа!! все сроки горят!!:insane::weep:
sashar2 сможешь до следущих праздников свой код на делфи перекинуть? а то я уже себе могилку копать начинаю..... :grob:

ПыСы: кстати, желательно комменты написать. мне потом надо будет превратить это в дллку, а потом и в компоненту.. так что особо не мудрите :wink:



Партнер
 

Member
Статус: Не в сети
Регистрация: 05.12.2005
ggKk
Если сделать просто задержку моим способом, то будет вот так:
Код:
procedure WaitPlease(Milliseconds: integer);
var Frequency, EndTime, CurrentTime, WaitTime: Int64;
begin
  QueryPerformanceFrequency(Frequency);
  WaitTime := Trunc((Frequency / 1000) * Milliseconds);
  QueryPerformanceCounter(EndTime);
  EndTime := EndTime + WaitTime;
  repeat
    QueryPerformanceCounter(CurrentTime)
  until (CurrentTime >= EndTime)
end;
Могу привести вариант кода, с чтением значения rdtsc, как предложил serj. Полностью класс на паскаль переписывать чет неохота... :)


 

Junior
Статус: Не в сети
Регистрация: 24.06.2007
Откуда: Москва
пиши, что можешь.. буду разбираться)) если бы не ваша помощь,я бы вообще не знала как быть. :wink:


 

Junior
Статус: Не в сети
Регистрация: 24.06.2007
Откуда: Москва
последний рывок.. функции разобраны, отлажены. сделан вариант через поток, все оформено в компоненту.. дело за малым: нужно сделать редактор потоков через TCollection, чтобы каждому потоку задавались свои параметры. :) никогда с таким не работала, не совсем представляю как это выглядит (т.е как выглядить знаю, как это туда запихнуть не совсем понятно))

Код:

unit TimeDelayManager;

interface

uses Windows, Forms, Classes;

type
  TTimeDelayManager = class;

  TTimerThread = class(TThread)
  private
    FOwner: TTimeDelayManager;
  protected
    procedure DoUserEvent;
  public
    constructor Create(CreateSuspended: Boolean; AOwner: TTimeDelayManager);
  protected
    procedure Execute; override;
  end;

  TTimeDelayManager = class(TComponent)
  private
    FHardTime: Boolean;
    FDelay: LongWord;
    FTimerThread: TTimerThread;
    FOnTimer: TNotifyEvent;
    procedure WaitPlease;
  public
    constructor Create(AOwner: TComponent); override;
    procedure Start;
    procedure StartAsThread;
  published
    property Delay: LongWord read FDelay write FDelay;
    property HardTime: Boolean read FHardTime write FHardTime;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TTimeDelayManager]);
end;

{ TTimeDelayManager }

constructor TTimeDelayManager.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDelay := 1000;
  FHardTime := False;
end;

procedure TTimeDelayManager.WaitPlease;
var
  Frequency, EndTime, CurrentTime, WaitTime: Int64;
begin
  QueryPerformanceFrequency(Frequency);
  WaitTime := Trunc((Frequency / 1000) * FDelay);
  QueryPerformanceCounter(EndTime);
  EndTime := EndTime + WaitTime;
  repeat
    if not FHardTime then
      Application.ProcessMessages;
    QueryPerformanceCounter(CurrentTime)
  until (CurrentTime >= EndTime);
end;

procedure TTimeDelayManager.Start;
begin
  WaitPlease;
  if Assigned(FOnTimer) then
    FOnTimer(Self);
end;

procedure TTimeDelayManager.StartAsThread;
begin
  TTimerThread.Create(False, Self);
end;

{ TTimerThread }

constructor TTimerThread.Create(CreateSuspended: Boolean; AOwner: TTimeDelayManager);
begin
  inherited Create(CreateSuspended);
  FOwner := AOwner;
end;

procedure TTimerThread.Execute;
begin
  FOwner.WaitPlease;
  Synchronize(DoUserEvent);
end;

procedure TTimerThread.DoUserEvent;
begin
  if Assigned(FOwner.FOnTimer) then
    FOwner.FOnTimer(FOwner);
end;

end.




Добавлено спустя 1 минуту, 30 секунд
sashar2

спасибо! :wink:


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
serj писал(а):
[off]Мысли вслух, из серии 'тихо сам с собою'...
Зачем делать 2 треда и этот зоопарк с вызовом Win32? Это долго, в эти моменты вынь может отобрать время и привет родственникам.
Я бы сделал 2 вещи:
1. откалибровал TSC
2. юзал один тред.
Зная временные отметки TSC не трудно написать таск, который проверяет наступление времени и 'когда настало' выполнял бы свои действия. Т.к. точно известно отставание от сетки запуска, то это можно учесть при работе с устройством (если надо).
И вообще, понятия 'запуск через 2 mS' и 'запуск каждые 2mS' принципиально различаются, вынь далеко не realtime система.
Разница-то собственно не велика, вынь со своей preemtive многопоточностью не позволит добится высокой точности, нужен кернел мод и свой isr хэндл. В общем, я как бы уже с виндой не дружу давненько :)[/off]
Добавлено спустя 4 минуты, 12 секунд
Плюс такая новая штука, как Intel Dynamic Acceleration как пошутит с tsc, долго расхлебывать будеш.

А вообще, есть такая вещь, как HPET, и WinXP его не пользует, и прерываний у него, если не изменяет память, не одно и не два, и на всех хватит, так что свой таймер под виндой - реально.

_________________
Ку ку


 

Junior
Статус: Не в сети
Регистрация: 24.06.2007
Откуда: Москва
люди...аууу (((

никто не знаком с такими классами? (TCollection, TCollectionItem)? :weep:


 

ggKk писал(а):
люди...аууу (((

никто не знаком с такими классами? (TCollection, TCollectionItem)? :weep:


Я столкнулся с похожей проблемой, правда не для диплома, а по
необходимости. Сам имею маленький опыт программирования на VB, а с
другими языками не знаком. всвязи с этим хотел бы узнать у Вас.
удалось ли вам закончить компонент таймера. (ветка форума была
заброшена.)
Если это возможно, то хотелось бы получить в окончательном варианте
элемент ActiveX (осх файл). так как его можно использовать в любой
среде программирования.
Если вас не затруднит ответьте в форуме, или на мыло, или на форуме
http://www.cyberforum.ru/cpp-beginners/thread20934.html
где обсуждается таймер на микросекунду.

В любом случае заранее спасибо и извините за беспокойство.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 27 • Страница 2 из 2<  1  2
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan