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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Timer1, Многопоточность! 
:(
    Опции темы
Молоток
Дата 16.4.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот меня терзает задача уже несколько дней:
у меня есть Timer1 и он конкретно выполняет действия с интервалом.
Как мне сделать что бы таймер выполнял рязные действия с разным интервалом, при этом на форме юзался только Один компонент таймера.
Спасибо!

Это сообщение отредактировал(а) Молоток - 16.4.2008, 16:00
PM MAIL   Вверх
MetalFan
Дата 16.4.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



ишь какой! и рыбку съесть и сковородку не помыть.
так меня интервалы динамически


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Молоток
Дата 16.4.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MetalFan, Ну а толку ?
Если у меня допустим на 1 таймере надо выполнить 20 задач.
 smile 
PM MAIL   Вверх
1Andrey1
Дата 16.4.2008, 17:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я конечно не совсем понимаю зачем нужен такой изврат... но как вариант сделать чтобы таймер тикал чаще, в OnTimer считать количество тиков и выполнять каждое действие через определенное количество тиков, для каждого события - своё 
PM MAIL ICQ   Вверх
ama_kid
Дата 16.4.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(Молоток @  16.4.2008,  16:35 Найти цитируемый пост)
Если у меня допустим на 1 таймере надо выполнить 20 задач.
меняй динамически обработчик таймера



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
MetalFan
Дата 16.4.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Молоток @  16.4.2008,  16:35 Найти цитируемый пост)
Если у меня допустим на 1 таймере надо выполнить 20 задач.

одновременно? невозможно


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Poseidon
Дата 17.4.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Вместо TTimer используй TRxTimerList из библиотеки RxLib.

Цитата
Компонента предназначена для вызова пользовательских методов для обработчки события через заданные промежутки времени. Компонента поддерживает функциональность, аналогичную компоненте TTimer, но позволяет использовать один таймер Windows для всей очереди событий, хранящейся в списке Events (элементы типа TRxTimerEvent), сохраняя таким образом системные ресурсы, особенно в 16-битных приложениях. Каждое событие в очереди может быть активным или неактивным (свойство Enabled). Интервал вызова обработчиков задается в миллисекундах и имеет тип Longint, т.е. не имеет ограничения на длину интервала таймера Windows в 65535 мсек. 

Вы можете создавать события в дизайнере с помощью редактора компоненты TRxTimerList. Любое событие может быть "однократным", т.е. после одного его срабатывания через заданное время оно становится неактивным (в зависимости от значения свойства Cycled). 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Молоток
Дата 17.4.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Poseidon, Спасибо!
1Andrey1,  Также спасибо интересная идея.
PM MAIL   Вверх
mmvds
Дата 17.4.2008, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Например нужно чтоб задачи выполнялись каждые 1000, 2000, 3000 мс 
НОД(1000,2000,3000)=1000 
ставим интервал таймера 1000.
Далее заводим счетчик тактов (целочисленная переменная), когда он без остатка делится на нужный интервал/нод выполняем нужное действие для этого интервала.

Пример:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+Timer1.Interval;
if (i mod 1000/1000) =0 then
  begin
  {Делаем то, что нужно для таймера с интервалом 1000}
  end;
if (i mod 2000/1000) =0 then
  begin
  {Делаем то, что нужно для таймера с интервалом 2000}
  end;
if (i mod 3000/1000) =0 then
  begin
  {Делаем то, что нужно для таймера с интервалом 3000}
  end;
end;

PM MAIL ICQ   Вверх
Poseidon
Дата 17.4.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



mmvds, только вот проблема с ограниченностью i. Какого бы типа она не была, все-равно этот тип имеет максимально-допустимое значение. А если программе нужно работать день? А если неделю? А если серверное приложение и месяцами нужно "пахать"? Ну ты понял... smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
mmvds
Дата 17.4.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



integer хватит на 2^31/1000/60/60/24 = приблизительно 25 дней это если интервал 1мс поставить smile
ну хорошо, добавим в конец обнуление после 2 млрд итераций, кстати в первой строчке у меня ошибка была 
вместо i:=i+Timer1.Interval; надо i:=i+1;
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+1;
if (i mod 1000/1000) =0 then
  begin
  {Делаем то, что нужно для таймера с интервалом 1000}
  end;
if (i mod 2000/1000) =0 then
  begin
  {Делаем то, что нужно для таймера с интервалом 2000}
  end;
if (i mod 3000/1000) =0 then
  begin
  {Делаем то, что нужно для таймера с интервалом 3000}
  end;
end;
if i>=2000000000 then i:=0;


Это сообщение отредактировал(а) mmvds - 17.4.2008, 10:45
PM MAIL ICQ   Вверх
Poseidon
Дата 17.4.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(mmvds @  17.4.2008,  10:44 Найти цитируемый пост)
надо i:=i+1;
inc(i) smile

Цитата(mmvds @  17.4.2008,  10:44 Найти цитируемый пост)
кстати в первой строчке у меня ошибка была вместо i:=i+Timer1.Interval; надо i:=i+1;
Ну тогда уже и 1000/1000 можно не писать, а просто 1 ставить.

Короче, оффтоп. Харэ smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
mmvds
Дата 17.4.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



1000/1000 это для наглядности нужный интервал/нод, а i:=i+Timer1.Interval; действительно ошибка, т.к. 1000 mod 2 =0 а в первую итерацию операции для интервала 2000 не должны выполняться, так что никакого оффтопа
PM MAIL ICQ   Вверх
Молоток
Дата 17.4.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Poseidon, Мужики спасибо огромное много чего понел:
А если вот зачада так стоит:
Денамический таймер:
Я в листбокс  добовляю зачдачу например cmd.exe /C start index.bat 
Далие Задаю задачу cmd.exe /C start index2.bat 
И так далие до безконечности.
Как сделать что бы бежало в цикле и проверяло ?
Спасибо. 
PS данные о задачах хранятся в реестре: тойсть есть переменная с интервалом и параметрами задачи.
Как сделать что бы это работало всё в цикле.
Спасибо!

PM MAIL   Вверх
Antony41
Дата 14.2.2013, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



создай отдельный поток в onExecute потока
Код

whle not Terminated do
   doWorking;

и обращайся через синхронизацию к лист боксу

Код

procedure doWorking;
var
   I: integer;
   LB: ^TListBox;
   s: string;
begin
   LB := @Form1.ListBox1;
  for I := 0 to LB.Count - 1 do
    begin
      Synchronize(
         procedure 
            begin
              S := LB^.Items[I];
              //обрабатываем строку S
              //короче тут что хочешь можно делать с ней.
              //потом допустим отправляешь на обработку эту строку
              Processing(S);
            end;
      )
    end;
  
end;


Добавлено @ 10:20
написал находу так что может есть ошибки

Добавлено @ 10:23
еще можно в основном потоке, но я бы сделал всё таки в отдельном
Код

while True do
begin
  Application.ProcessMessages;
  for I := 0 to ListBox.Count - 1 do
    begin
    //тоже самое что и в потоке
    end;
end;


Это сообщение отредактировал(а) Antony41 - 14.2.2013, 10:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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