Вниз
Скачать: CL | DM;

Таймер в потоке   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.024 c
1-1098975439
Norn
2004-10-28 18:57
2004.11.14
Определения файла, для открытия которой была вызвана программа


1-1098942518
NeyroSpace
2004-10-28 09:48
2004.11.14
Как отсортировать TVirtualStringTree?


10-1058336312
abc
2003-07-16 10:18
2004.11.14
как организовать обратную связь в DCOM? т.е от сервера к клиенту


14-1098954327
dr Tr0jan
2004-10-28 13:05
2004.11.14
Разница между GMT и Московским временем


6-1094637858
Gear
2004-09-08 14:04
2004.11.14
UDP порт 5555 с заданным IP в сети или нет?




   Наверх