![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про TTimer. [D7, XP]
vegarulez © (2008-10-09 08:05:00)Доброго времени суток всем мастерам!
Вопрос такой, есть Timer ,у которого есть какой-то интервал допустим 120000 милисекунд. Как узнать на какой он сечас милисекунде отсчёта, и как поменять это значение?
vegarulez (2008-10-09 14:16:00) [1]Anatoly Podgoretsky © (09.10.08 11:42) [13]
нужен... индюки вешают приложение.
sniknik © (09.10.08 10:53) [12]
поток может вызвать какойнибудь эксцепшн(при работе с инетом) и допустим ликвидироваться. во всяком случае я так делаю.
Anatoly Podgoretsky (2008-10-09 11:42:00) [2]> sniknik (09.10.2008 10:53:12) [12]
А если подумать? Может и поток не нужен.
sniknik (2008-10-09 10:53:00) [3]каким то сложным путём идёте товарищи... всего то нужен один простой поток у которого в цикле выполняется действие (то чем сейчас поток занимается), в конце цикла проверка - прошло "время х"? значит новый виток цикла. нет? значит небольшой "слип" (можно "разбитый" на части для проверки терминейта) на время до него.
и все. никакого таймера, ожиданий, множественных созданий/запусков потока, просто стартовал в начале и он сам себя обслуживает, до конца.
конечно если правильно понял, что делается...
Сергей М. (2008-10-09 10:37:00) [4]Ну тогда примерно так:
FMyThread: TMyThread = nil;
..
procedure ConditionalStartThread;
begin
if Assigned(FMyThread) and (WaitForSingleObject(FMyThread.Handle, 1) = WAIT_OBJECT_0) then
FreeAndNil(FMyThread);
if not Assigned(FMyThread) then
FMyThread := TMyThread.Create(..); //FreeOnTerminate д.б. False !!
end;
Обработчик событий таймера с интервалом тиков = 1 сек:
Inc(Seconds);
if Seconds = 120 or NeedThreadStart(Seconds) then begin
Seconds := 0;
ConditionalStartThread;
end;
vegarulez (2008-10-09 10:20:00) [5]Сергей М. © (09.10.08 10:10) [9]
Да. всё верно.
Сергей М. (2008-10-09 10:10:00) [6]Т.е. поток, должен быть запущен либо в любое время по требованию либо не реже 1 раза в 2 минуты, так ?
При этом в любой момент времени допускается работа не более чем одного доп.потока данного класса ?
Palladin (2008-10-09 10:09:00) [7]
> vegarulez © (09.10.08 08:17) [3]
> Palladin © (09.10.08 08:13) [2]
> Обыдно...
за долгие годы программирования мне, почему-то, это не понадобилось. не вижу ничего обидного. в чем проблема получить статус потока? телепатирую, что у него (FreeOnTerminate=true)=true, так вот нефиг делать FreeOnTerminate:=True когда тебе от объекта потока нужно получать какую либо информацию. Все логично до нельзя. А когда не логично - нельзя.
Сергей М. (2008-10-09 10:03:00) [8]
> не знаю как по другому получить сведения о запущенном мною
> потоке
Какие конкретно ?
vegarulez (2008-10-09 09:58:00) [9]Сергей М. © (09.10.08 08:28) [4]
милисекундная точность не нужна. использую секундную точность
Не... дело в том что у меня переодически каждые 2 минуты запускается поток. И чтобы он не запустил 2,3,... экземпляр потока, пока не закончит свою работу тот 1-ый экземпляр потока, я ввёл 2 переменных. Одна переменная - тригер (integer 0,1). А вторая вермя считает, и запускает поток каждые 2 минуты, если он не запущен, т.е. если тригер равен =0.
Просто не знаю как по другому получить сведения о запущенном мною потоке.
Поэтому бывает нужно поток запустить именно сечас, не дожидаясь 120-ой секунды цикла. допустим на 101-ой секунде 2-ух минутного цикла. Он отрабатывает, и сбрасывает переменную в 0 секунд, и она опять начинает тикать. Вот собственно...
sniknik (2008-10-09 08:43:00) [10]> Тогда просто завести переменную? Чтобы она была inc по таймеру
если дело только в том "узнать на какой он сечас милисекунде отсчёта", то inc не нужен, да и таймер тоже, достаточно в переменную сохранить точку отсчёта (системные тики), и в любой момент когда понадобится можно будет посчитать "на какой он сейчас" простой разницей между тиками сейчас и сохранённым значением... т.е. таймер не нужен. для этого. а что там по задаче которую ты делаешь хз.
Сергей М. (2008-10-09 08:28:00) [11]
> может сразу можно с таймером работать
Можно и с таймером.
Но не нужно.
> интервал 1000 милисекунд допустим.И к ней обращаться...
> И её менять
Именно так.
Только зачем ее менять, если вопрос прозвучал "как узнать" ?
И зачем нужна миллисекундная точность ?
vegarulez (2008-10-09 08:17:00) [12]Palladin © (09.10.08 08:13) [2]
Обыдно...
Тогда просто завести переменную? Чтобы она была inc по таймеру который имеет интервал 1000 милисекунд допустим.И к ней обращаться... И её менять?...
з.ы. Просто я сечас так делаю. Думал может сразу можно с таймером работать.
Василий Жогарев (2008-10-09 08:13:00) [13]FormatDateTime('hh:mm:ss.zzz', Now), но я подозреваю что я вас не понял.
Palladin (2008-10-09 08:13:00) [14]никак