Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Вниз

Много таймеров 


Leviathan   (2002-01-01 04:27) [0]

Мастера, объясните незнающему человеку, есть ли что-нибудь плохое в наличии нескольких таймеров в программе. У меня их аж четыре, по идее можно оптимизировать в один, но принесет ли это какую нибудь пользу?



SoftOne   (2002-01-01 04:59) [1]

1. Не принесет
2. Подумай лучше, где ещё оптимизировать программу.



RaZEr   (2002-01-01 07:08) [2]

Каждая переменная , тип , класс есть память , поэтому если можно уложить в 1 таймер лучше это сделай .

А плохого то ничего нет , ... как впрочем и хорошего 8)



Nikolay   (2002-01-01 17:58) [3]

имхо есть
таймер тормозит работу системы :(
и по-моему больше 29 таймеров одновременно запускать нельзя
если я не прав поправьте



panov   (2002-01-01 18:02) [4]

>Nikolay © (01.01.02 17:58)
Хоть тысячу таймеров создай - абсолютно без разницы.
Систему не тормозит.



DK   (2002-01-04 02:39) [5]

>Nikolay © (01.01.02 17:58)
Только что 500 штук запустил
загрузка проца:
при 1 -> 0.2%
при 500 -> приблизительно столько же



iZEN   (2002-01-04 05:17) [6]

1_таймер == 1_нить(Thread).



False_Delirium   (2002-01-04 05:47) [7]

лишь экземпляр класса занимает память.....остальное же зависит от кода в обрабатываемой ф-ции таймера... Просто оценить сложость алгоритма и кол-во действий......в зависимости от этого реализовать код...



Алексей Петров   (2002-01-04 09:04) [8]

> iZEN (04.01.02 05:17)
Врешь !!!



Alx2   (2002-01-04 09:30) [9]

Про кол-во таймеров цитата из Delphi Help:
TTimer encapsulates the Windows API timer functions.
Caution: Limitations on the total number of timers system-wide are system dependent.



Builder   (2002-01-04 14:08) [10]

Так же там напискана рекомендация
Use one timer component for each timer in the application.
Тоесть оптимизация данная не помогает.



iZEN   (2002-01-06 10:29) [11]

>Алексей Петров © (04.01.02 09:04)
>Врешь !!!

Вру! Обшибся.:)



Андре   (2002-01-09 17:26) [12]

Знаете, а по-моему про отдельные нити - это фигня. Я делал два таймера(с разным временем срабатывания) - например 1 и 2 секунды. И на первый вешал процедуру, которая выполняется секунд десять. Так вот, пока эта процедура не завершалась, второй таймер не срабатывал. Попробуйте. Или я не прав ?



Андре   (2002-01-09 17:31) [13]

Даже если таймеры одинаковые, попробуйте:

procedure TForm1.Timer1Timer(Sender: TObject);
var i : integer;
begin
for i:=1 to 50000 do
begin
Label1.Caption:=IntToStr(i);
Label1.Refresh;
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var i : integer;
begin
for i:=1 to 50000 do
begin
Label2.Caption:=IntToStr(i);
Label2.Refresh;
end;
end;

Пока первая процедура не завершится, второй таймер не сработает.



Юрий Зотов   (2002-01-09 17:37) [14]

1 таймер = 1 объект + 1 скрытое окно.

То есть, расход памяти + расход ресурсов.

4 таймера, конечно, не вопрос, а вот, скажем, 100 таймеров - это уже вопрос. В общем, дело хозяйское, но лучше оптимизировать.



panov   (2002-01-09 17:38) [15]

>Андре (09.01.02 17:26)
Это по-твоему.
Объясни цель, для чего предназначен приведенный тобой код.



Romkin   (2002-01-09 17:44) [16]

TTimer работает через оконные сообщения, но, по-моему, на одно окно где-то десяток байт идет в этом случае.
Можно попробовать реализовать таймер ручками через callback, может, и будет оптимальнее, но не уверен, да и запрет есть на вызов системных функций.
Думаю, если вопрос о ресурсах не стоит остро - ничего делать не надо



Boris   (2002-01-10 18:17) [17]

to Андре (09.01.02 17:31)
Даже если таймеры одинаковые, попробуйте:

procedure TForm1.Timer1Timer(Sender: TObject);
var i : integer;
begin
for i:=1 to 50000 do
.
.
.

а Application.ProcessMessages для барашков придумали!?
при таких примочках вообще ничего работать небудет.
Ни таймеры ни другие процессы.



iZEN   (2002-01-11 21:04) [18]

Сейчас точно не могу сказать, может кто проверит (у кого Delphi5).
В Delphi5 компонент TTimer, кажется, был реализован на основе TThread, поэтому он был независим от "соседних" timer-ов. Посмотрите исходники. Может я прав?
В Delphi6 он точно реализован на основе оконной функции.



Андре   (2002-01-14 14:51) [19]

Уважаемые знатоки.

Вышеприведенным кодом я хотел опровергнуть высказанное ранее утверждение о том, что каждый таймер заводит под себя нить. Цитирую - "1_таймер == 1_нить(Thread).".
Насчет Application.ProcessMessages. Если я правильно понимаю этот метод прерывает выполнение приложения, позволяя ему обработать очередь сообщений.
В случае, если бы TTimer работал в отдельной нити, никакой ProcessMessages, как я понимаю, не был бы нужен.
И наконец, посмотрев исходники TTimer (в Delphi6) я не нашел ничего похожего на то, что он работает в отдельном потоке.

Если я и не прав, что я вполне допускаю, поправьте меня. С благодарностью приму новую для себя информацию.

Спасибо всем.



Alx2   (2002-01-14 15:24) [20]

Конечно, нить непричем. В конце концов, о чем спор, если все расписано в документации?

В Delphi help:

Description

TTimer is used to simplify calling the Windows API timer functions SetTimer and KillTimer, and to simplify processing the WM_TIMER messages . Use one timer component for each timer in the application.

Timer properties and methods affect the functionality of the timer by providing information for the timer event. This information includes the timer interval, which corresponds to the parameter for the Windows API SetTimer function. The actual execution of the timer occurs through its OnTimer event.

Caution: Limitations on the total number of timers system-wide are system dependent.
А теперь про SetTimer См. SDK:

The SetTimer function creates a timer with the specified time-out value.

UINT SetTimer(

HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);


Parameters

hWnd

Identifies the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.

nIDEvent

Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored.

uElapse

Specifies the time-out value, in milliseconds.

lpTimerFunc

Points to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc.
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message"s MSG structure contains the value of the hWnd parameter.



Return Values

If the function succeeds, the return value is an integer identifying the new timer. An application can pass this value, or the string identifier, if it exists, to the KillTimer function to destroy the timer. If the function fails to create a timer, the return value is zero.

Remarks

An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the DispatchMessage function simply calls the callback function instead of the window procedure. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

The wParam parameter of the WM_TIMER message contains the value of the nIDEvent parameter.

See Also

DispatchMessage, KillTimer, MSG, TimerProc, WM_TIMER

Думаю, здесь все ясно сказано :)



Алексей Петров   (2002-01-14 16:40) [21]

> iZEN (11.01.02 21:04)
Опять сочиняешь? :)
С Delphi 1 до Delphi 6 Таймер был и есть оконное сообщением.
Никогда Thread-ом он не был. На основе Thread бывают таймеры сторонних производителей ...




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.021 c
3-99844           Аль                   2001-12-25 13:17  2002.01.31  
Пример о DCOM


3-99918           ЕвгенийА              2001-12-30 19:06  2002.01.31  
Запись в поле...


3-99886           alina                 2001-12-26 11:54  2002.01.31  
Параметры драйвера


7-100073          Serega_2              2001-10-15 11:37  2002.01.31  
Помогите плз програмно прибить досувскую программу.


1-99965           Aleksandr             2002-01-14 11:12  2002.01.31  
Проекция объектов