Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизТаймер в потоке Найти похожие ветки
← →
snake1977 (2004-11-01 10:06) [0]Здравствуйте!! подскажите, как можно организовать таймер в отдельном потоке?
в программе запускается несколько потоков, каждый из которых в установленный для него период времени должен выполнять определнные действия. Sleep, неудобен :( потому что при большом интервале (например каждые 5 минут выполнятся проверка каталога) программу невозможно завершить пока весь sleep не закончится :(.
Поставить TTimer... а как тогда будет обрабатываться событие Ontimer в каком потоке?
← →
Reindeer Moss Eater © (2004-11-01 10:07) [1]А ожидать тиков таймера будем в позорном цикле?
← →
TUser © (2004-11-01 10:09) [2]
> программу невозможно завершить пока весь sleep не закончится
> :(.
TerminateThread
Кроме того - ставь sleep не 5 минут, а по 2 сек, и проверяй - не прошли ли эти 5 минут.
Если хочешь таймер - создай его, потом
OnTimer:=<метод>; Enabled:=true
← →
Erik1 © (2004-11-01 10:11) [3]А WaitForMultiObject(...,1000*60*5) никак ненаписать? Если нужен exit устанавливаем событие и в перед.
← →
Digitman © (2004-11-01 10:14) [4]
> Поставить TTimer... а как тогда будет обрабатываться событие
> Ontimer в каком потоке?
в том потоке, который вызвал конструктор TTimer.Create
← →
snake1977 (2004-11-01 10:15) [5]>>TUser
ежели я поставлю TTimer, то в каком потоке он обрабатывается ??
в том где сделали Create ??
>>Erik1
а что это WaitForMultiObject?? в хелпе я чего то не нашел
← →
Erik1 © (2004-11-01 10:21) [6]Status := WaitForMultipleObjects(Ord(High(tmEvent.Event)) + 1, @tmEvent.Event, false, fTimeOut); //INFINITE
Поиши на этом сайте данную API функцию, много чего найдеш. А давал пример с использованием масива событий.
← →
snake1977 (2004-11-01 10:24) [7]>>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;
а как тогда будет вести себя поток??
он не завершиться после выполнения этой процедуры??
← →
snake1977 (2004-11-01 10:31) [8]>>Erik1
не совсем то чего надо эта функция. у меня крутиться несколко потоков абслоютно разных по своим дествиям, а основной поток просто регулирует запуск и останов дочерних. т.е. каждый поток сам в себе :)
← →
DiamondShark © (2004-11-01 11:50) [9]
> snake1977 (01.11.04 10:31) [8]
Ну так и поставь таймер в основном потоке, как обычно это делается, а дополнительные потоки просто пинать в нужное время.
Например, посылая им сообщения.
← →
Digitman © (2004-11-01 12:00) [10]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 13:23) [11]
> Digitman © (01.11.04 12:00) [10]
Мой телепатор уже выдал следующий вопрос: "Я сделал как вы советовали, но всё равно не могу остановить поток раньше чем через 5 минут."
← →
REA (2004-11-01 13:36) [12]А Create/SetWaitableTimer не пойдет?
← →
snake1977 (2004-11-01 14:04) [13]>>DiamondShark
хреновый у тебя телепатор
← →
Добрый дядька © (2004-11-01 14:38) [14]>snake1977 (01.11.04 14:04)
А вы, Товарищъ, лучше бы прореагировали бы, изъявив благодарность, когда Вам помогают, вместо того, чтобы язвить.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c