Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2010, 02:39   #1
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
Восклицание Запуск таймера из потока (delphi 2010)

Вопрос глупый конечно, но звените)
Приведённый ниже код тестил на Delphi 7/9 код на данных версиях работает, но на delphi 2010 ни в какую не хочет, компилится, но дейсвие в таймере не происходит.

Форма
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
THread2:THread;
begin
 THread2:=THread.Create(true);
 THread2.FreeOnTerminate:=true;
 THread2.Priority:=tpLower;
 THread2.Resume;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
tmr1.Enabled:=False;
form1.Caption:='таймер работает!';
end;
end.
Поток
Код:
procedure THread.Execute;
begin
Form1.tmr1.Enabled:=True;
end;
end.
Terikon вне форума Ответить с цитированием
Старый 07.08.2010, 09:53   #2
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

Попробуй создать таймер в потоке. Или при создании потока заноси таймер
Код:
 type TTimerThread = class(TThread)
  constructor Create(thtimer: TTimer);
  procedure Execute; override;
  private
   thrTimer: TTimer;
 end;

constructor TTimerThread.Create(thtimer: TTimer);
begin
 inherited Create(true);
 thrTimer:= thtimer; //или новый
 FreeOnTerminate:= true;
 Priority:= tpLower;
 Resume;
end;

procedure TTimer.Execute;
begin
 thrTimer.Enable:= true;
end;
alexprey вне форума Ответить с цитированием
Старый 07.08.2010, 11:39   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Просто в потоке используйте Syncronize и всё у вас заработает. Надо так
Код:
procedure THread.Execute;
begin
Syncronize(Form1.tmr1.Enabled:=True);
end;
end.
FaTaL вне форума Ответить с цитированием
Старый 07.08.2010, 13:05   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Terikon Посмотреть сообщение
Приведённый ниже код тестил на Delphi 7/9 код на данных версиях работает, но на delphi 2010 ни в какую не хочет
Если что-то работает - это ещё не значит, что это правильно.

Обращения к VCL из других потоков - запрещены.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.08.2010, 14:18   #5
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Просто в потоке используйте Syncronize и всё у вас заработает. Надо так
Код:
procedure THread.Execute;
begin
Syncronize(Form1.tmr1.Enabled:=True);
end;
end.
Сделал так
Код:
Synchronize(Form1.tmr1.Enabled:=True);
но не компилится, выдаёт
Код:
[DCC Error] Unit2.pas(21): E2250 There is no overloaded version of 'Synchronize' that can be called with these arguments
[DCC Fatal Error] Project2.dpr(6): F2063 Could not compile used unit 'Unit2.pas'
Terikon вне форума Ответить с цитированием
Старый 07.08.2010, 15:34   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Стоп Ошибся.
Нужно вывести в другую процедуру, например
Код:
procedure TimerON;
begin
  Form1.tmr1.Enabled:=True
end;

procedure THread.Execute;
begin
  Syncronize(TimerON);
end;
FaTaL вне форума Ответить с цитированием
Старый 07.08.2010, 15:49   #7
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Стоп Ошибся.
Нужно вывести в другую процедуру, например
Код:
procedure TimerON;
begin
  Form1.tmr1.Enabled:=True
end;

procedure THread.Execute;
begin
  Syncronize(TimerON);
end;
Насколько я знаю, проблемы с синхронизацией возникают при доступе к VCL, а это же таймер...

Можно например, использовать, на мой взгляд тупой метод,
добавляешь глобальную переменную типа boolean, и еще один таймер. В таймере при значении переменной True включаешь первый таймер. А в самом потоке присваиваешь переменной значение True
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 07.08.2010, 15:58   #8
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Комменты, вставляемые средой, читать полезно... Но для чего городить целый поток (жрет в системе кучу ресурсов и 1 Мб под стек) ради того, чтобы выполнить одну (!) строчку кода и завершиться?

Если тебе нужно периодечески в фоновом потоке что-то делать, то делай так (реализация Execute);
Код:
begin
  while not Terminated do begin
    DoSomething; // Не забываем про Syncronize при необходимости
    Sleep(Нужное время);
  end;
end;
И таймеры не нужны

Последний раз редактировалось Ins; 07.08.2010 в 16:07.
Ins вне форума Ответить с цитированием
Старый 07.08.2010, 16:06   #9
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Ins Посмотреть сообщение
Комменты, вставляемые средой, читать полезно... Но для чего городить целый поток (жрет в системе кучу ресурсов и 1 Мб под стек) ради того, чтобы выполнить одну (!) строчку кода и завершиться?
Он может сократил код в потоке для тебя, чтобы ты сосредоточился на потоках
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 07.08.2010, 16:21   #10
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Цитата:
Попробуй создать таймер в потоке.
Веселое предложение Но вот вопрос, событие OnTimer наступает при извлечении из очереди сообщения WM_TIMER и диспетчеризации его нужному окну. Эти действия выполняет петля сообщений в методе Application.Run. А кто это будет делать в неосновном потоке? Как до таймера дойдет сообщение WM_TIMER, учитывая что у каждого потока очередь сообщений своя? Сколько времени дать на размышление?

Последний раз редактировалось Ins; 07.08.2010 в 16:28.
Ins вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение максимального потока в сетях Delphi ftp123 Помощь студентам 2 02.06.2010 07:26
Delphi, приоритет потока edmynt Помощь студентам 1 28.02.2010 14:04
Создание таймера Borland Delphi vitalina21 Помощь студентам 20 19.01.2010 20:23
Настройка таймера в Delphi The riddle Помощь студентам 6 06.12.2009 13:31
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45