Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.07.2012, 13:50
Omeha2 Omeha2 вне форума
Прохожий
 
Регистрация: 20.07.2012
Сообщения: 3
Репутация: 10
Вопрос [Вопрос] Как реализовать обработчик некоторого количества таймеров?

Здравствуйте!

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

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

Вопрос такой - как лучше реализовать поставленную задачу?

Была идея каждый таймер называть так "имя+номер задания" а потом в единственном (для всех таймеров)
обработчике событий считывать Sender'ом это имя, вырезать номер и исполнять нужное задание с этим номером.
Выходит немного монструозно =) Есть какие то идеи как это реализовать другим, менее извращенным способом?

Заранее спасибо!
Ответить с цитированием
  #2  
Старый 20.07.2012, 13:55
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

все это делается с помощью одного таймера...
Ответить с цитированием
  #3  
Старый 20.07.2012, 14:00
Omeha2 Omeha2 вне форума
Прохожий
 
Регистрация: 20.07.2012
Сообщения: 3
Репутация: 10
По умолчанию

Можно пожалуйста по подробнее?
Ответить с цитированием
  #4  
Старый 20.07.2012, 14:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1. по варианту ТС: у таймера тоже есть свойство Tag
2. по предложеному: один таймер проверяет какие задания из списка необходимо запустить сейчас, естественно для каждого задания нужно хранить время его последнего запуска - если разница между настоящим больше или равна интервалу запуска, то запускаем
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 20.07.2012, 14:37
stanilar stanilar вне форума
Прохожий
 
Регистрация: 31.08.2009
Сообщения: 30
Репутация: 140
По умолчанию

Тип списка какой?

Если TObjectList - то добавить к каждому объекту по таймеру, если не TObjectList - то сделать через TObjectList.
Ответить с цитированием
  #6  
Старый 20.07.2012, 19:34
Аватар для @Rafa3L
@Rafa3L @Rafa3L вне форума
Начинающий
 
Регистрация: 09.11.2011
Адрес: Москва
Сообщения: 144
Версия Delphi: XE2
Репутация: 11216
По умолчанию

Цитата:
Сообщение от stanilar
Тип списка какой?

Если TObjectList - то добавить к каждому объекту по таймеру, если не TObjectList - то сделать через TObjectList.

Обычная таблица:
Код:
var
ax:array[0..100,0..2] of integer;

a[11,0] - длительность задания
a[11,1] - секунда начала
a[11,2]:=a[11,1] +a[11,0]  - секунда конца ( вычисляем заранее, чтобы не выполнять лишних операций)

Далее в событии онтаймер

for i:=1 to 100 do
begin
if a[i,2]= Текущая_секунда then
завершить
if a[i,2]= Текущая_секунда then
начать задание
end;

Минус в том что каждую секунду придется проверять все задания.
__________________
Помогаю платно.
Помогаю иногда бесплатно.
Ответить с цитированием
  #7  
Старый 20.07.2012, 20:52
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

мне тоже думается что одним таймером можно сделать, но при желании можно сделать и чтобы каждый таймер знал только своё задание
Ответить с цитированием
  #8  
Старый 21.07.2012, 02:17
Omeha2 Omeha2 вне форума
Прохожий
 
Регистрация: 20.07.2012
Сообщения: 3
Репутация: 10
По умолчанию

Эм, извиняюсь, не точно поставил вопрос.

Код:
type TTask=array[1..10] of string;
        TTaskList=array[1..100] of TTask

мне нужно к каждому элементу массива TTaskList "прикрутить" таймеры чтоб они через заданий промежуток времени(для каждого таймера разный) обрабатывал по очереди элементы своего массива TTask, как лучше это сделать?
Ответить с цитированием
  #9  
Старый 21.07.2012, 05:03
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Что мешает использовать record?
Код:
type
  TTask = record
    Task  : array[0..9] of string;
    Timer : TTimer;
  end;

var
  TaskList : array[0..99] of TTask;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 23.07.2012, 09:43
stanilar stanilar вне форума
Прохожий
 
Регистрация: 31.08.2009
Сообщения: 30
Репутация: 140
По умолчанию

Код:
TMyTask = class(TObject)
  public
    FTask : array[1..10] of string;
    FTimer : TTimer;
    procedure OnTimer(Sender : TObject);
    constructor Create(AInterval : integer);
    destructor Destroy;
  end;

  procedure TMyTask.OnTimer(Sender : TObject);
  begin
    ...
    FTask
    ...
  end;

  constructor TMyTask.Create(AInterval : integer);
  begin
    inherited Create;
    FTimer := TTimer.Create;
    FTimer.Interval := AInterval;
    FTimer.OnTimer := OnTimer;
    //  FTimer.Enable := True;
  end;

  destructor Destroy;
  begin
    FTimer.OnTimer := nil;
    FTimer.Free;
    inherited Destroy;
  end;




  ...
  var List : TObjectList;
  ...
  procedure ...
  var Tmp : TMyTask;
  begin
    Tmp := TMyTask.Create(interval);
    Tmp.FTask := ...
    Tmp.FTimer.Enabled := True;
    ...
    List.Add(Tmp)
    ...
  end;
  ...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter