Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1094453575
Гость
2004-09-06 10:52
2004.11.14
Передача картинки по http.


1-1099320334
Kat
2004-11-01 17:45
2004.11.14
Как узнать сколько дней в январе например?


6-1093250377
Lex_!
2004-08-23 12:39
2004.11.14
Веб чат на дельфи, работа с Response


14-1098646074
Dimedrol
2004-10-24 23:27
2004.11.14
Блоки питания - 250W -vs- 400W


6-1094360393
V_Mir
2004-09-05 08:59
2004.11.14
POP3 Attachments и ClientSocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский