Главная страница
    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.004 c
15-1313667310
Кто б сомневался
2011-08-18 15:35
2011.12.11
А на каких языках пишуться высокоресурсные 3D игры?


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


2-1314285762
brother_home
2011-08-25 19:22
2011.12.11
форматирование integer с разделением по 1000 пробелом


15-1314088885
xayam
2011-08-23 12:41
2011.12.11
Переключатель на светильник


2-1314252487
Onyx2012
2011-08-25 10:08
2011.12.11
Фильтр по значению в Express Quantum Grid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский