Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: 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 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.057 c
1-1099042745
race1
2004-10-29 13:39
2004.11.14
unicode + win95 98


4-1096890030
DelphiLexx
2004-10-04 15:40
2004.11.14
Персонажи, подобные скрепке в Microsoft Word e


1-1099130123
Artemiy2004
2004-10-30 13:55
2004.11.14
Как скопировать небольшую часть картинки в новый битмап?


8-1092301028
tarantino
2004-08-12 12:57
2004.11.14
видеопоток из устройст ввода видео


1-1099027450
JOnyto
2004-10-29 09:24
2004.11.14
Приостановление выполнения процедуры до нажатия кнопки "Далее"!