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

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

Таймер в потоке


snake1977 ©   (2004-11-01 10:06:00) 

Здравствуйте!! подскажите, как можно организовать таймер в отдельном потоке?
в программе запускается несколько потоков, каждый из которых в установленный для него период времени должен выполнять определнные действия. Sleep, неудобен :( потому что при большом интервале (например каждые 5 минут выполнятся проверка каталога) программу невозможно завершить пока весь sleep не закончится :(.

Поставить TTimer... а как тогда будет обрабатываться событие Ontimer в каком потоке?


Добрый дядька   (2004-11-01 14:38:00) [1]

>snake1977   (01.11.04 14:04)

А вы, Товарищъ, лучше бы прореагировали бы, изъявив благодарность, когда Вам помогают, вместо того, чтобы язвить.


snake1977   (2004-11-01 14:04:00) [2]

>>DiamondShark
хреновый у тебя телепатор


REA   (2004-11-01 13:36:00) [3]

А Create/SetWaitableTimer не пойдет?


DiamondShark   (2004-11-01 13:23:00) [4]


> Digitman ©   (01.11.04 12:00) [10]

Мой телепатор уже выдал следующий вопрос: "Я сделал как вы советовали, но всё равно не могу остановить поток раньше чем через 5 минут."


Digitman   (2004-11-01 12:00:00) [5]

TCompThread = class(TThread)
..
 procedure TimerProc(Sender: TObject);
..
end;

procedure TCompThread.TimerProc;
begin
DoSomething;
end;

procedure TCompThread.Execute;
begin
try
 Timer1:=TTimer.Create(nil);
 try
  Timer1.OnTimer := TimerProc;
  Timer1.Enabled:=True;
  while not Terminated and GetMessage(Msg, 0, 0, 0) do
    DispatchMessage(Msg);
 finally
  Timer1.Free;
 end;
except
 //перехват  необраб.исключений
end;
end


DiamondShark   (2004-11-01 11:50:00) [6]


> snake1977   (01.11.04 10:31) [8]

Ну так и поставь таймер в основном потоке, как обычно это делается, а дополнительные потоки просто пинать в нужное время.
Например, посылая им сообщения.


snake1977   (2004-11-01 10:31:00) [7]

>>Erik1
не совсем то чего надо эта функция. у меня крутиться несколко потоков абслоютно разных по своим дествиям, а основной поток просто регулирует запуск и останов дочерних. т.е. каждый поток сам в себе :)


snake1977   (2004-11-01 10:24:00) [8]

>>DigitMan
тогда еще вопрос
я делаю по подобию одного примера
и там в процедуре обработки стоит следующее

procedure CompThread.Execute;
begin
  while not Terminated do
   Begin
     DoWork;
   end;
end;

где DoWork метод класса потока
т.е. бесконечный цикл пока не будет вызван Terminate.
как тогда должна выглядеть эта процедура??
типа
procedure CompThread.Execute;
begin
Timer1:=TTimer.Create(nil);
Timer1.Enabled:=True;
end;

а как тогда будет вести себя поток??
он не завершиться после выполнения этой процедуры??


Erik1   (2004-11-01 10:21:00) [9]

Status := WaitForMultipleObjects(Ord(High(tmEvent.Event)) + 1, @tmEvent.Event, false, fTimeOut); //INFINITE
Поиши на этом сайте данную API функцию, много чего найдеш. А давал пример с использованием масива событий.


snake1977   (2004-11-01 10:15:00) [10]

>>TUser
ежели я поставлю TTimer, то в каком потоке он обрабатывается ??
в том где сделали Create ??

>>Erik1
а что это WaitForMultiObject?? в хелпе я чего то не нашел


Digitman   (2004-11-01 10:14:00) [11]


> Поставить TTimer... а как тогда будет обрабатываться событие
> Ontimer в каком потоке?


в том потоке, который вызвал конструктор TTimer.Create


Erik1   (2004-11-01 10:11:00) [12]

А WaitForMultiObject(...,1000*60*5) никак ненаписать? Если нужен exit устанавливаем событие и в перед.


TUser   (2004-11-01 10:09:00) [13]


> программу невозможно завершить пока весь sleep не закончится
> :(.

TerminateThread

Кроме того - ставь sleep не 5 минут, а по 2 сек, и проверяй - не прошли ли эти 5 минут.

Если хочешь таймер - создай его, потом
OnTimer:=<метод>; Enabled:=true


Reindeer Moss Eater   (2004-11-01 10:07:00) [14]

А ожидать тиков таймера будем в позорном цикле?


Наверх

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