Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Таймер... [D7, XP]


Владимир ©   (2006-06-26 02:59:00) 

Доброго времени суток ).

Я может чего-то не понимаю, но чтобы запустить событие таймера OnTimer нужно значение Enabled перевести в true. Верно?

Так вот код где я перевожу Enabled в true (собственно для чего таймер и нужен (интервал равен 1 секунде) OnTimer не вызывается (вообще)):

procedure TForm1.LoginServerClientConnect(Sender: TObject;
 Socket: TCustomWinSocket);
var
s: string;
AutorizationThread: TMyThreadServer;  // Поток для подключившегося клиентаbegin
// Включаем Timer
LoginTimer.Enabled := true;
repeat
// Повторяем до тех пор, пока таймер не выключиться. А он выключиться через секунду
if LoginTimer.Enabled = false then
begin
 // "Загоняем" пришедший текст в переменную s
 s := Socket.ReceiveText;
 // Создаем поток (чтобы не загружать основное приложение)
 // Т.е. повышаем скорость проверки\отправки данных
 AutorizationThread := TMyThreadServer.Create(true);
 with AutorizationThread do
  begin
   // "Передаем" пришедший текст
   R_Text := s;
   // "Говорим" потоку, что делать
   ActionCode := 1;
   // Приоритет потока делаем нормальным
   Priority := tpNormal;
  // "Передаем" адрес подключившегося компьютера
   UserHost :=  Socket.RemoteAddress;
   // Посылаем поток на выполнение
   Resume; // Без этого поток не заработает (стандартная процедура запуска потока)
   // А это уже мой "запуск" потока
   Run;
  end;
 AutorizationThread.Free;
 AutorizationThread.Destroy;
end;
until LoginTime = true;;
end;

А вот что происходит в событии OnTimer:

procedure TForm1.LoginTimerTimer(Sender: TObject);
begin
LoginTime := true;
LoginTimer.Enabled := false;
end;

Что-то не могу понять что не так? Почему OnTimer не вызывается?


Zeqfreed   (2006-06-27 01:31:00) [1]

А какой смысл использовать таймер? Здесь, насколько я понимаю, он используется для того, чтобы ограничить выполнение цикла repeat...until примерноодной секундой?


Владимир   (2006-06-27 00:38:00) [2]


> Не соглашусь в данном случае. Елинсвенно верное решение
> - убарть цыкл а запуск потока - в обработчик таймера.


Его невозможно туда убрать. По какой причине объяснять не стану. Но это не в обшем случае, а именно в моем из-за особенности взаимодействия клиент\серверных приложений. И моей реализации всего этого (притом не самой лучшей).


softservice   (2006-06-26 04:22:00) [3]


>  Единственный способ решения сей проблемы уже указан. ProcessMessages.

Не соглашусь в данном случае. Елинсвенно верное решение - убарть цыкл а запуск потока - в обработчик таймера.


Германн   (2006-06-26 03:47:00) [4]

> Владимир   (26.06.06 03:26) [6]
> А насчёт главного приложение, как главного потока и отдельных
> потоков в приложении - знаю. Просто я уже запутался со всеми
> этими потоками. В этой проге у меня и так поток в потоке.
>  Про таймер как думать ...


Забудь про потоки на время. У тебя есть процедура LoginServerClientConnect содержащая цикл по условию, которое не может измениться внутри даноого цикла!А может измениться только по внешнемусобытию. Буде это нажатие на кнопку/клавишу или событие таймера - всё равно. А внешние события не могут быть обработаны системой до тех пор пока ты не завершишь выполнение процедуры. Единственный способ решения сей проблемы уже указан. ProcessMessages. Он позволяет не выходя из процедуры обработать внешниесобытия.


Владимир   (2006-06-26 03:26:00) [5]

А насчёт главного приложение, как главного потока и отдельных потоков в приложении - знаю. Просто я уже запутался со всеми этими потоками. В этой проге у меня и так поток в потоке. Про таймер как думать ...


Владимир   (2006-06-26 03:24:00) [6]

Спасибо. Забыл совсем что проверять то надо )


softservice   (2006-06-26 03:23:00) [7]


> Надо вставить в тело цикла Application.ProcessMessages

Именно!
Проблемма в следующем:
Так как твой цикл выполняется в главном потоке приложения, то приложения не может принимать сообщения (которые post, а не send), потому как цикл выборки сообщений тоже работает в основном потоке.
А так как таймер в дельфе реализован на сообщениях, а не на CallBack функции, то твое приложение не может обработать событие таймера. Вставив в цикл ProcessMessages ты заставишь выполнится процедуру выборки сообщений.
Но это кривой метод. Пустые циклы некорректно использовать. Они жрут процессорное время.


Плохиш   (2006-06-26 03:17:00) [8]


> Владимир   (26.06.06 02:59)

Надо вставить в тело цикла Application.ProcessMessages.


Владимир   (2006-06-26 03:16:00) [9]

х.ммммммм
То что ты выделил - это проверка на как раз таки произошло ли событие OnTimer или нет?

А если ошибка здесь, то что ты предлагаешь?


softservice   (2006-06-26 03:07:00) [10]

> repeat
> ...
> until LoginTime = true;;

Вот по-этому он никогда не вызовет OnTimer


Наверх

Титульная страница Поиск, карта сайта Написать письмо