Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий Белькевич   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
2-1314552284
Gu
2011-08-28 21:24
2011.12.11
Dll


4-1252784613
Ruzzz
2009-09-12 23:43
2011.12.11
Фишки Vista/Win7 в Delphi (типа прогресс в панеле задач)


1-1277226424
AKomander
2010-06-22 21:07
2011.12.11
По два раза приходят перехваченные пакеты через WM_COPYDATA.


2-1314065077
анонимус
2011-08-23 06:04
2011.12.11
сглаживание, выделение границ и т.д и т.п.


1-1276512538
Дмитрий Белькевич
2010-06-14 14:48
2011.12.11
Ищу реализацию таймера в треде.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский