![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Таймер в потоке
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]А ожидать тиков таймера будем в позорном цикле?