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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 13:23   #1
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
Вопрос Таймер в потоке

У меня есть поток. В нем мне нужно создать таймер и чтобы он выполнился в этом потоке. Таймер на любое время. По истечению таймера поток должен уничтожиться как мне это реализовать?
alexprey вне форума Ответить с цитированием
Старый 09.08.2010, 13:34   #2
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Непонятно зачем тут поток, если он ничего не будет делать, а только спать и ждать таймер (и жрать ресурсы системы), а когда проснется - что-то выполнит и уничтожится. Где параллельность выполнения?
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 14:43   #3
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

Зачем лишние вопросы?? Просто как сделать??
alexprey вне форума Ответить с цитированием
Старый 09.08.2010, 14:53   #4
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Затем, что отвечая на форумах, я пытаюсь дать хороший совет, а не плохой, так как:
1. Кто знает, может когда-то написанная тобой программа попадет ко мне на комп
2. Кто знает, может когда-то мне придется работать с написанным тобой кодом
3. Кто знает, может мой ответ когда-либо кто-либо найдет в интернете и вставит в свою программу, и потом, возможно она попадет на мой комп или мне придется работать с этим кодом или человеком, который его написал?

Поэтому и спрашиваю, чтобы ты сделал правильно, а не так, как ты считаешь что это правильно.
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 15:05   #5
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Код:
// Поток
var
 b : boolean;
begin
 while b do
 begin
 {Код}
 sleep(1000); 
 if {условие выполнилось} then
 b := false;
 end;
end;
или так (не совсем понял вопрос)
Код:
//Поток
begin
 {Код потока}
 sleep(1000);// Ждать одну секунду, после чего уничтожить поток
end;

Последний раз редактировалось kangreon; 09.08.2010 в 15:08.
kangreon вне форума Ответить с цитированием
Старый 09.08.2010, 16:47   #6
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

ХМ. Гениально. А точность хорошая???

kangreon, нет все таки не подходит. Мне надо продолжать дальше действия.
Ins, я как пишу чтения скриптов для своего движка. Каждый скрипт выполняется в отдельном потоке, чтобы рендеринг изображения не приостанавливался. Так ты мне можешь помочь?

Последний раз редактировалось Stilet; 11.08.2010 в 09:39.
alexprey вне форума Ответить с цитированием
Старый 10.08.2010, 22:39   #7
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Так, а причем здесь таймер?
Ins вне форума Ответить с цитированием
Старый 11.08.2010, 10:49   #8
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

короче, от вашего форума толку нету. Уже кажись понял как сделать. Можно сделать так???
Код:
TMyThRead = class(TThRead)
 constructor Create(code: string);
 protected
  procedure Execute; override;
 private
  FCode: string;
  procedure onTimer(Sender: TObject);
 end;

constructor TMyThRead(code: string);
begin
 inherited Create(false);
 FCode:= code;
 FreeOnTerminate:= true;
 Resume;
end;

procedure TMyThRead.Execute;
 var timer: TTimer;
begin
 if FCode = 'starttimer' then
 begin
  timer:= TTimer.Create(nil);
  timer.interval:= 5000;
  timer.onTimer:= onTimer;
  timer.Enable:= true;
  FreeOnTerminate:= false;
 end;
end;

procedure TMyThRead.onTimer(Sender: TObject);
begin
 //Мои действия
 Sender.Free;
 Destroy;
end;
alexprey вне форума Ответить с цитированием
Старый 11.08.2010, 11:00   #9
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Нет нельзя
1. Создавая в потоке таймер, как я говорил уже в соседнем топике, нужно позаботится о том, кто будет извлекать из очереди сообщения WM_TIMER и доставлять их адресату. Это не главный поток, тут нет Application.Run, следовательно сообщения сами по себе до адресата не дойдут и твой OnTimer никогда не сработает
2. Ты похоже не понимаешь, что после завершения метода Execute твой поток сразу завершится. Т.е. как только он у тебя запустится и проведет инициализацию таймера. Все, после этого нет ни потока, ни возможности сработать таймеру
3. У тебя утечка ресурсов. Так как поток сразу завершается и при этом он не убивает TTimer

Последний раз редактировалось Ins; 11.08.2010 в 11:08.
Ins вне форума Ответить с цитированием
Старый 11.08.2010, 11:32   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от alexprey Посмотреть сообщение
короче, от вашего форума толку нету
Известная проблема.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Trouble с функцией в потоке Sam Gold Общие вопросы C/C++ 0 03.05.2010 21:04
Создать таймер в потоке? TwiX Общие вопросы Delphi 9 23.02.2010 21:39
работа с TStringList в потоке OPF_Nik Помощь студентам 6 01.02.2010 15:15
Ошибка в потоке User>lia Общие вопросы Delphi 5 20.01.2009 18:55
TClientSocket в потоке BlackOmen Работа с сетью в Delphi 8 27.04.2008 22:19