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

Вниз

Как сделать паузу?   Найти похожие ветки 

 
ХХХХХ   (2013-02-27 22:36) [0]

Имеется самодельный таймер, построенный на GetTickCount. (1 штука в примере)
Обрабатывается в OnIdle.

Но нужно сделать паузу.
Т.е. когда устанавливаю паузу, обновляться ничего не должно.
А как только её убираю - должно произойти продолжение обработки таймера.

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

Как бы сделать так, чтобы не происходил последний пункт.



var
 IsPause:  boolean;
 n:        LongWord;
 Store:    LongWord;
 Interval: LongWord = 3000;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
 Done:= False;

 If (GetTickCount - Store >= Interval) then
 begin
   Store:= GetTickCount;

   Inc(n);                      // Делаем что-то.
   Caption:= IntToStr(n); // Показываем, что сделали.
 end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 IsPause:= CheckBox1.Checked;
end;



 
clickmaker ©   (2013-02-27 22:42) [1]

а стандартный таймер чем не устроил?
но если уж хочется пополнить ряды велосипедостроителей, то
IsPause:= CheckBox1.Checked;
if not IsPause then Store := GetTickCount;


 
ХХХХХ   (2013-02-27 22:52) [2]


> clickmaker ©   (27.02.13 22:42) [1]
>
> а стандартный таймер чем не устроил?


Много объектов со своими интервалами.


 
ХХХХХ   (2013-02-27 22:53) [3]


> clickmaker ©   (27.02.13 22:42) [1]


Как слишком привязано получается.

Может как нибудь остановить GetTickCount?

Типа:


function GetTicks: LongWord;
begin
 Result:= GetTickCount;
end;



 
имя   (2013-02-27 23:01) [4]

Удалено модератором


 
clickmaker ©   (2013-02-27 23:08) [5]

> Много объектов со своими интервалами

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Inc(TotalInterval, Timer1.Interval);
 if (TotalInterval mod Obj1.Interval) = 0 then
   Obj1.DoSomething;
 ...
 if (TotalInterval mod ObjN.Interval) = 0 then
   ObjN.DoSomething;
end;


 
ХХХХХ   (2013-02-27 23:23) [6]


> clickmaker ©   (27.02.13 23:08) [5]


Тут один и тот же интервал.
Как будет при разном?


 
clickmaker ©   (2013-02-27 23:25) [7]

> Как будет при разном?

у каждого объекта может быть свой. Одно условие: у таймера минимальный интервал, а у объектов - кратный ему


 
Jeer ©   (2013-02-27 23:34) [8]


> clickmaker ©   (27.02.13 23:08) [5]


Это крах для неокрепшего ума XYZ :)


 
ХХХХХ   (2013-02-28 00:24) [9]


> clickmaker ©   (27.02.13 23:25) [7]
>
> > Как будет при разном?
>
> у каждого объекта может быть свой. Одно условие: у таймера
> минимальный интервал, а у объектов - кратный ему


Тогда зачем там TTimer?
Получается почти тоже самое, что у меня.

if (TotalInterval mod Obj1.Interval) = 0 then

Может заменить на это:

if (Obj1.Interva >= TotalInterval) then

Ведь может проскочить.


 
anonims   (2013-02-28 09:27) [10]


> Получается почти тоже самое, что у меня.

кроме
OnIdle если нам нечего делать, займем себя и процессор.
OnTimer если нам нечего делать, то подождем и пусть другие программы занимают процессор.
при необходимости timer легко остановить (сделать паузу!) а потом снова также легко включить.
timer1.Enabled:=false;
timer1.Enabled:=false;

вообще говоря
GetTickCount -Store <> Timer.Interval
время работы программы(процесса) <= астрономическое время

(Obj1.Interva >= TotalInterval) ==TRUE !всегда
>у таймера минимальный интервал, а у объектов - кратный ему (т.е. большиЙ).


 
Jeer ©   (2013-02-28 09:30) [11]


> Ведь может проскочить.


Что может проскочить?
Inc начнет через 2 считать?


 
Сергей М. ©   (2013-02-28 09:32) [12]


> Получается почти тоже самое, что у меня


Не получается.
Логика возникновения OnIdle иная, нежели у OnTimer.

Вчитайся в описание:

OnIdle is called only once, as the application transitions into an idle state. It is not called continuously unless the Done parameter is set to false. Applications that set Done to false consume an inordinate amount of CPU time, which affects overall system performance


Установив Done=false ты мочалишь CPU почем зря, бестолково отнимая драгоценные временнгые кванты у других кодовых потоков в системе.
А при Done=True твой таймер жив пока приложение получает сообщения пользовательского ввода.


 
ХХХХХ   (2013-02-28 20:43) [13]


> Сергей М. ©   (28.02.13 09:32) [12]
>
>
> > Получается почти тоже самое, что у меня
>
>
> Не получается.
> Логика возникновения OnIdle иная, нежели у OnTimer.
>
> Вчитайся в описание:


Я про то, что OnIdle и OnTimer с 1 мс. - почти одно и то же.


> anonims   (28.02.13 09:27) [10]


Вот эта строка:

Inc(TotalInterval, Timer1.Interval);

Напишите мне пример, где используется 2 таких таймера.
Я посмотрю.


 
clickmaker ©   (2013-02-28 21:03) [14]

а зачем 2 таймера?


 
Сергей М. ©   (2013-02-28 22:33) [15]


> Я про то, что OnIdle и OnTimer с 1 мс. - почти одно и то
> же


Это с какого же перепугу ?


 
Jeer ©   (2013-02-28 23:05) [16]


> Это с какого же перепугу ?


Чукча.
Ему тут уже много чего наговорили полезного в разных ветках, но чукча не купается с мылом, у него другие методы:)


 
Сергей М. ©   (2013-02-28 23:07) [17]


> Jeer ©   (28.02.13 23:05) [16]


Неужели лыжи ?)


 
Jeer ©   (2013-02-28 23:08) [18]

Не.. они трутся друг о друга, так и моются:)
Так, что - нужен еще один чукча, как минимум.


 
Сергей М. ©   (2013-02-28 23:14) [19]


> Jeer ©   (28.02.13 23:08) [18]


)

Не знал)
Надо взять на вооружение на случай вселенской мыльно-банно-коммунальной катастрофы)


 
ХХХХХ   (2013-03-01 14:34) [20]


> Jeer ©   (28.02.13 23:05) [16]
>
>
> > Это с какого же перепугу ?
>
>
> Чукча.


Нацик в треде.


> Сергей М. ©   (28.02.13 22:33) [15]
>
>
> > Я про то, что OnIdle и OnTimer с 1 мс. - почти одно и
> то
> > же
>
>
> Это с какого же перепугу ?


Что нет?


> clickmaker ©   (28.02.13 21:03) [14]
>
> а зачем 2 таймера?


Можно и 3.


 
Сергей М. ©   (2013-03-01 14:43) [21]


> ХХХХХ   (01.03.13 14:34) [20]


Конечно что нет.


 
clickmaker ©   (2013-03-01 14:48) [22]

> Можно и 3

а зачем? В предложенном мной варианте можно обойтись одним


 
ХХХХХ   (2013-03-01 15:14) [23]

> Сергей М. ©   (01.03.13 14:43) [21]
> ХХХХХ   (01.03.13 14:34) [20]
> Конечно что нет.

В данном контексте, вообще не суть.


> clickmaker ©   (01.03.13 14:48) [22]
>
> > Можно и 3
>
> а зачем? В предложенном мной варианте можно обойтись одним


Я не про TTimer"ы.
А про наши "таймеры".


 
clickmaker ©   (2013-03-01 15:24) [24]

> [23] ХХХХХ   (01.03.13 15:14)

ваши "таймеры" можно сделать на одном TTimer


 
ыуа   (2013-03-02 15:32) [25]

ыуа


 
ХХХХХ_   (2013-03-02 15:32) [26]


> clickmaker ©   (01.03.13 15:24) [24]
>
> > [23] ХХХХХ   (01.03.13 15:14)
>
> ваши "таймеры" можно сделать на одном TTimer


Покажите примером.


 
clickmaker ©   (2013-03-02 15:42) [27]

> Покажите примером

Приехали... А в [5] что?


 
ХХХХХ_   (2013-03-02 16:43) [28]

Это: Inc(TotalInterval, Timer1.Interval);

Какой у Timer1 интервал?
Не 0?


 
Inovet ©   (2013-03-02 17:06) [29]

> [28] ХХХХХ_   (02.03.13 16:43)
> Какой у Timer1 интервал?

Какая разница. Выше всё объяснили. Всё равно мелких интервалов ты просто так не получишь, и что важнее - точно вовремя не получишь.


 
clickmaker ©   (2013-03-02 17:54) [30]

> Какой у Timer1 интервал?

[7] прочитал?



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

Форум: "Прочее";
Текущий архив: 2013.07.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.003 c
2-1353827595
ДенисПФ
2012-11-25 11:13
2013.07.21
Packed Record to MemoryStream


15-1362067551
Ega23
2013-02-28 20:05
2013.07.21
А почему над картошкой дышат?


2-1353340493
toropoff
2012-11-19 19:54
2013.07.21
bass.dll


15-1360285956
Кто б сомневался
2013-02-08 05:12
2013.07.21
Медленная отрисовка 2D GDI Windows 7 (в 4.5 раза медленнее XP)


15-1361903162
Дмитрий С
2013-02-26 22:26
2013.07.21
TList<TRecord>





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