Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

Ищу реализацию таймера в треде.   Найти похожие ветки 

 
Дмитрий Белькевич   (2010-06-14 14:48) [0]

TTimer не работает, если управлять им из треда. Waitable Timer не имеет события (а нужно именно событие, не задержка). Скажите, видел ли кто реализацию Waitable Timer с генерацией события (как я себе представляю, Waitable Timer в отдельном треде).


 
~AQUARIUS~ ©   (2010-06-14 15:09) [1]

Сделайте в нити петлю сообщений и заработает ваш TTimer


 
Дмитрий Белькевич   (2010-06-14 15:16) [2]

Нашел таки...

http://www.google.com/codesearch/p?hl=ru#CxUs5Idmy2w/download/Stepper17.zip%7CVIUzRXe8mi0/StepperMotor%20Ver.1.7/src/StepperMotor.pas&q=CreateWaitableTimer%20lang:pascal

Не знаю, насколько рабочее, правда... Вроде бы лицензионных ограничений нет.


 
Дмитрий Белькевич   (2010-06-14 15:20) [3]


> Сделайте в нити петлю сообщений и заработает ваш TTimer


С ним хитро. В 7-ке работало без вопросов. В 2010 - работает, только если enabled менять синхронно, т.е. делаю Synchronize, в нём - дёргаю enabled, всё работает. Но уже хотелось бы по-людски сделать.


 
Rouse_ ©   (2010-06-14 15:27) [4]

А SetTimer с указанием TIMERPROC чем не устроил?


 
Сергей М. ©   (2010-06-14 15:49) [5]


> TTimer не работает, если управлять им из треда


Угу.
Вот прямо так и говорит - я, таймер, не работаю, если мной управляют из треда.


 
Дмитрий Белькевич   (2010-06-14 16:20) [6]


> Вот прямо так и говорит - я, таймер, не работаю, если мной
> управляют из треда.


Ага. Мессагу на экран выбрасывает :)

Сделал с помощью SetTimer.


 
Дмитрий Белькевич   (2010-06-14 16:22) [7]

Всем спасибо, да.


 
DVM ©   (2010-06-15 00:03) [8]


> Дмитрий Белькевич

вот еще хороший материал по таймеру http://www.delphikingdom.com/asp/viewitem.asp?catalogid=434

Там и реализация


 
Германн ©   (2010-06-15 00:52) [9]


> DVM ©   (15.06.10 00:03) [8]

Нечто подобное было в RxLib. TRxTimerList. Может и в JEDI есть. Не знаю, но возможно автору стоит проверить хоть он уже и сказал, что сделал на основе WinAPI SetTimer.


 
Timer Writer   (2010-06-17 15:42) [10]

Вот только что написанный класс - таймер в отдельном потоке (как раз для одного проекта потребовался). Но предупреждаю - еще не тестировался.

unit ThreadTimer;

interface

uses
 Windows, Classes;

type
 TTimerThread = class(TThread)
 private
   FEnabled: boolean;
   FInterval: cardinal;
   FEvent: THandle;
   FOnTimer: TNotifyEvent;
   procedure SetEnabled(const Value: boolean);
   procedure SetInterval(const Value: cardinal);
   procedure Stop;
   procedure DoTimer;
 protected
   procedure Execute; override;
 public
   constructor Create(CreateSuspended: boolean; AInterval: cardinal = 1000);
   destructor Destroy; override;
   property Enabled: boolean read FEnabled write SetEnabled;
   property Interval: cardinal read FInterval write SetInterval;
   property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
 end;

implementation

{ TTimerThread }

constructor TTimerThread.Create(CreateSuspended: boolean; AInterval: cardinal);
begin
 inherited Create(True);
 FInterval := AInterval;
 FEvent := CreateEvent(nil, False, False, nil);
 SetEnabled(not CreateSuspended)
end;

destructor TTimerThread.Destroy;
begin
 Terminate;
 Stop;
 Resume;
 if GetCurrentThreadId <> ThreadID then
   WaitFor;
 CloseHandle(FEvent);
 inherited
end;

procedure TTimerThread.DoTimer;
begin
 if FEnabled and Assigned(FOnTimer) then
   FOnTimer(Self)
end;

procedure TTimerThread.Execute;
begin
 while not Terminated do
   if WaitForSingleObject(FEvent, FInterval) = WAIT_TIMEOUT then
     Synchronize(DoTimer)
end;

procedure TTimerThread.SetEnabled(const Value: boolean);
begin
 if FEnabled <> Value then
 begin
   Stop;
   FEnabled := Value;
   if FEnabled then
     Resume
 end
end;

procedure TTimerThread.SetInterval(const Value: cardinal);
begin
 if FInterval <> Value then
 begin
   FInterval := Value;
   if FEnabled then
   begin
     Stop;
     SetEnabled(True)
   end
 end
end;

procedure TTimerThread.Stop;
begin
 FEnabled := False;
 SetEvent(FEvent);
 while Suspended do
   Resume;
 Suspend
end;

end.


 
Сергей М. ©   (2010-06-17 16:09) [11]


> procedure TTimerThread.Execute;
> begin
>  while not Terminated do
>    if WaitForSingleObject(FEvent, FInterval) = WAIT_TIMEOUT
> then
>      Synchronize(DoTimer)
> end;
>


Толку от такого "таймера в отдельном потоке" - что от 5-го колеса у телеги)


 
Timer Writer   (2010-06-17 16:30) [12]


> Сергей М. ©   (17.06.10 16:09) [11]

Почему?


 
Anatoly Podgoretsky ©   (2010-06-17 16:32) [13]

> Сергей М.  (17.06.2010 16:09:11)  [11]

Его с успехом заменяет SLEEP


 
Сергей М. ©   (2010-06-17 16:32) [14]


> Timer Writer   (17.06.10 16:30) [12]


Потому что обработка событий таймера у тебя все равно выполняется в осн.потоке.


 
Timer Writer   (2010-06-17 16:39) [15]


> Его с успехом заменяет SLEEP

Если Sleep ставить в основном потоке, то остановится интерфейс. Что, конечно, не годится.

А если ставить Sleep в отдельном потоке, то каким образом прервать этот Sleep?

Никаким. А это нужно при переустановке параметров таймера и в его деструкторе.


> обработка событий таймера у тебя все равно выполняется в осн.потоке.

И это правильно. А ожидание тика происходит в доп. потоке. Что тоже правильно.


 
Сергей М. ©   (2010-06-17 16:50) [16]


> ожидание тика происходит в доп. потоке. Что тоже правильно


Ниразу не правильно, если обработка тика все равно вынесена в осн.поток.
Что толку ждать тик (а чего его ждать ? он все равно никуда не пропадет), если не гарантирована немедленная на него реакция ?


 
Timer Writer   (2010-06-17 17:20) [17]


> Сергей М. ©   (17.06.10 16:50) [16]

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


 
Сергей М. ©   (2010-06-17 17:24) [18]


> Timer Writer   (17.06.10 17:20) [17]


Наверно я не понимаю)
Ну не дано мне понять нагромождение кода, лишенное смысла)



Страницы: 1 вся ветка

Текущий архив: 2011.12.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
4-1251202011
ivanoff
2009-08-25 16:06
2011.12.11
прочесть что написано в Label другого приложния


15-1313526604
Юрий
2011-08-17 00:30
2011.12.11
С днем рождения ! 17 августа 2011 среда


15-1314004716
pointerman
2011-08-22 13:18
2011.12.11
Графический интерфейс программы


4-1252106846
demon
2009-09-05 03:27
2011.12.11
Как обработать нажатие на кнопку минимизации?


3-1268216193
Xmen
2010-03-10 13:16
2011.12.11
Экспорт из Excel в FireBird