Вниз
Скачать: 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.027 c
14-1099128975
Федя
2004-10-30 13:36
2004.11.14
GTA SAN Andreas


3-1097393378
Vladgul
2004-10-10 11:29
2004.11.14
Создание собственной БД


3-1097763050
denis24
2004-10-14 18:10
2004.11.14
Добавление записи в table


14-1098948854
clickmaker
2004-10-28 11:34
2004.11.14
Блин, задолбал центр американского английского


3-1097500706
AleXqwq
2004-10-11 17:18
2004.11.14
MySQL component for Delphi, not trial




   Наверх