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

Вниз

Таймер...   Найти похожие ветки 

 
Владимир   (2006-06-26 02:59) [0]

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

Я может чего-то не понимаю, но чтобы запустить событие таймера 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 не вызывается?


 
softservice ©   (2006-06-26 03:07) [1]

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

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


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

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

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


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


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

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


 
softservice ©   (2006-06-26 03:23) [4]


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

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


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

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


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

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


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

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


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


 
softservice ©   (2006-06-26 04:22) [8]


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

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


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


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


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


 
Zeqfreed ©   (2006-06-27 01:31) [10]

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



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

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

Наверх





Память: 0.47 MB
Время: 0.008 c
2-1151658794
fast2
2006-06-30 13:13
2006.07.16
Как перевести строку (типа String) в последовательность...


2-1151213766
prodeximus
2006-06-25 09:36
2006.07.16
Сортировка по полю


5-1135000220
Vaitek_
2005-12-19 16:50
2006.07.16
Ручная прорисовка TEdit


10-1121847387
serjufa
2005-07-20 12:16
2006.07.16
в листе excel нарисовать стрелки


1-1148994038
TSa
2006-05-30 17:00
2006.07.16
запись в ini файл с правами пользоваля





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