Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вкл. таймера в потоке 
:(
    Опции темы
Coobick
Дата 3.1.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Ммм.. Почему не получается запустить таймер например так?
Код

procedure TBos.Execute;
begin
With Form1.IdHTTP1.Request do Begin
  Form1.idHTTP1.AllowCookies:=True;
     try
     Form1.IdHTTP1.Get('http://forum.vingrad.ru');

    Form1.Timer1.Enabled:=True;
end;

Ведь enabled:=False;  работает,от чего же True не работает?   smile 

Таймер запускает поток и останавливается,по окончании процедуры его надо опять запустить.. как?  smile 
PM MAIL   Вверх
Poseidon
Дата 3.1.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Покажи всю TBos.Execute. finally где? До таймера или после? Возможно срабатывает ошибка, которая обрабатывается try и до таймера просто не доходит очередь. Ну и Timer.enabled:=False где? Поток вообще запускается хоть раз?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Coobick
Дата 3.1.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Да без разницы.. это я просто поторопился в примере..но сути оно не меняет. 

Так тоже не пашет..  Да и потом.. Ведь оно же выключает таймер нормально..значит всё "доходит" до него нормально.  Но вот надо то как раз наоборот..надо включить..а оно ни как)..
Код

procedure TTest.Execute;
begin
try
 Form1.IdHTTP1.Get('http://google.ru');
except
end;
 Form1.Timer1.Enabled:=True;
end;

И инди тут не при чём.. вообще таймер не запускается так..  Почему?
Код

procedure TTest.Execute;
begin
     Form1.Timer1.Enabled:=(True);
end;


Добавлено через 4 минуты и 30 секунд
Цитата(Poseidon @  3.1.2011,  16:18 Найти цитируемый пост)
Ну и Timer.enabled:=False где? Поток вообще запускается хоть раз? 

Про Timer.enabled:=False я к тому это это то работает! А вот Timer1.Enabled:=True; уже нет.. Поток ессно запускается... переходит по ссылке,всё хорошо... и после тишина).

PM MAIL   Вверх
Poseidon
Дата 3.1.2011, 16:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Тэкс, в первом примере таймер запустится только если IdHTTP1.Get выдаст ошибку. Если все пойдет гладко, то ничего не запустится, т.к. Except выполняется только если try генерирует ошибку. А вот второй код интересен. Период у таймера нормально установлен? Что у тебя вообще в OnTimer? Может тоже какое условие...


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Coobick
Дата 3.1.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Да в таймере без разницы что..  
Например так.
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
TTest.Create(false);
end;

procedure TTest.Execute;
begin
try
Form1.IdHTTP1.Get('http://google.ru');
except
end;
  Form1.Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Label1.Font.Color=clRed
        then Label1.Font.Color:=clLime
 else Label1.Font.Color:=clRed;
end;

Ведь если включить и поставить  там Form1.Timer1.Enabled:=false;  то срабатывает...  таймер выключается.. а с True нет.. :(
PM MAIL   Вверх
Poseidon
Дата 3.1.2011, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Ну во-первых, повторю еще раз, 12-я строка сработает только если 9-я строка выдаст ошибку. Во-вторых, я так понимаю, таймер запускается сразу при старте программы (еще в дизайнере). Тогда не понятно, где же он останавливается? Зачем выполнять 12-ю строку, если там и так True? 

В общем, тут слишком много нюансов. Давай, прикладывай проект с примером что не работает.

PS. А вообще, зачем останавливать таймер? Проверяешь в OnTimer, а не создан-ли уже поток. Если создан, то ждем еще, если нет, то создаем. И так по кругу.

Это сообщение отредактировал(а) Poseidon - 3.1.2011, 16:56


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Coobick
Дата 3.1.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Почему если только ошибка? Ведь если надо выключить таймер,оно в ЭТОМ месте его выключает нормально...

Вот пример..  После перехода по ссылке надо что бы включился таймер..

Код

try
Form1.IdHTTP1.Get('http://google.ru');
except
 Form1.Timer1.Enabled:=True;   А ошибка вроде как тут должна сработать..  :shok 
end;
           А тут наоборот делаем нужное.. мм  
end;


Это сообщение отредактировал(а) Coobick - 3.1.2011, 17:09

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  tesst.rar 6,76 Kb
PM MAIL   Вверх
Coobick
Дата 3.1.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Проблема вроде как в D2010...  в D7 говорят работает всё... сам пока не могу попробовать.. Но в чём косяк,должно же быть решение от чего в 2010 не работает?
PM MAIL   Вверх
Rrader
  Дата 4.1.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Coobick, а ничего, что ты работаешь с VCL в дополнительном потоке без синхронизации?



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Poseidon
Дата 4.1.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Rrader, так синхронизация же критична для визуальных компонентов. Для не визуальных можно. Или я чего-то напутал?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Coobick
Дата 4.1.2011, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Rrader, но другие пишут что всё работает на д7... только на д2010 от чего то не работает...  Или в таком случае может ваш вариант покажите.. ?
PM MAIL   Вверх
Coobick
Дата 4.1.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



поставил щас д7.... и правда всё работает.  компилю этот же проект на д2010 и не работает уже.  :(  в чём косяк интересно?
PM MAIL   Вверх
Rrader
  Дата 4.1.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Poseidon, это заблуждение, очень кратко поясню почему. Никогда не знаешь, когда нарвешься на грабли, даже вот этот код (который в комментарий при создании нового потока идет), может отлично работать долгое время.
Код

procedure TMyThread.UpdateCaption;
begin
  Form1.Caption := 'Updated in a thread';
end;

Но иногда программа будет вылетать, или радовать "спецэффектами" - например, в каком-то диалоге шрифт изменится, пропадут компоненты и т.п. Это - результат внутренних повреждений, когда произошел конфликт основного потока и дополнительного. Почему так происходит? Ответ - VCL (не только то, что касается компонентов) в некоторых местах содержит, во-первых, глобальные данные (общий ресурс), во-вторых, обращение к этим данным никак не защищается в плане многопоточности. Общая рекомендация по работе с сомнительным насчет thread-safety кодом изложена в справке Delphi (добавлю также, что речь идет не столько о самой функции Synchronize, сколько о синхронизации вообще):
Цитата

If you are unsure whether a method call is thread-safe, call it from within the Synchronize method to ensure that it executes in the main thread.

Ни слова о VCL. Потому что причина ошибок "родилась" до VCL.

Теперь смотрим сюда: 
Код

procedure TTest.Execute;
begin
  Form1.IdHTTP1.Get('http://google.ru');

Нужно задать себе несколько вопросов. Все ли нам известно о работе метода Get? А может быть такое, что в его недрах используются глобальные данные, которые могут пересекаться с основным потоком? Хм, я не знаю. Наверное, предпочту защититься. Я нарочно взял и этот код прокрутил специально на отлов ошибок. Ну и что - словил AV. С 3-го раза.
Те же грабли


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Poseidon
Дата 4.1.2011, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Rrader @  4.1.2011,  13:18 Найти цитируемый пост)
Но иногда программа будет вылетать, или радовать "спецэффектами" - например, в каком-то диалоге шрифт изменится, пропадут компоненты и т.п.
Шрифт больше относится именно к визуальным компонентам. Об этом речи нет. Но вот что касается не визуальных, то как-то не приходит в голову что может быть там глобального. Мне кажется, для того, что бы изменить Enable нашего таймера, синхронизация не нужна. Тем более что мы точно знаем, что меняется этот Enable только в одном месте. Но "глюк" с D2010 интересен.





--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Coobick
Дата 4.1.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 16.8.2010
Где: Владимир

Репутация: нет
Всего: 1



Rrader , но как вы объясните что в D7 работает и без "этого"?
В общем делал так.. вроде работает..таймер включается. Правильно ли?  
Код

  TTest = class(TThread)
  private
  procedure SetTime;
  protected
    procedure Execute; override;
  public
  end;

....
....


procedure TForm1.FormCreate(Sender: TObject);
begin
TTest.Create(false);
end;

procedure TTest.Execute;
begin
try
Form1.IdHTTP1.Get('http://google.ru');
except
end;
  Synchronize(SetTime);
end;

procedure TTest.SetTime;
begin
  Form1.Timer1.Enabled:=True;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Label1.Font.Color=clRed
        then Label1.Font.Color:=clLime
 else Label1.Font.Color:=clRed;
end;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.