Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Kaginava   (2004-07-09 09:16) [0]

Всем привет !!
Подскажите как правильно в отдельном потоке запустить таймер ?
я пробовал так
constructor mayTr.Create(interval:integer);
 begin
    inherited Create(True);
    FreeOnTerminate := True;
    Self.Priority := tpHighest;
    timer:=TTimer.Create(nil);
    timer.Interval:=interval;
    timer.OnTimer:= OnTimerSt;
    timer.Enabled:=true;
    resume;

 end;


если в конструкторе потока запустить таймер то что тогда в
методе Execute делать ?


 
KSergey ©   (2004-07-09 09:19) [1]

1.Зачем в потоке таймер? Там есть свои средства временного приостановления потока, если уж так надо. На WaitSingleObject и т.п. (это как раз и делать в Execute).
2.Self.Priority := tpHighest; - а хоршо ли это? да и Self тут всяко ни к чему.


 
Kaginava   (2004-07-09 09:31) [2]

таймер в потоке мне нужен потому что
этот поток запускается в сервисе и по таймеру необходимо выполнять определенные действия, а для того чтобы сервис отвечал на команды сервисменеджера основные действия должны выполняться в отдельном потоке, может я не прав.
спасибо!


 
Рамиль ©   (2004-07-09 09:33) [3]

Так поставь таймер в основном потоке, и запускай по нему дополнительный, сервис будет обрабатывать сообщения.


 
Kaginava   (2004-07-09 09:36) [4]

спасибо так и попробу сделать.


 
Fay   (2004-07-09 09:38) [5]

Таймер - объект ядра. Ему пофинг твои потоки. Описатель таймера можно хранить как данные основного или доп. потока. Куда хочешь - туда и суй. Всё равно получишь результат. 8)


 
Тимохов ©   (2004-07-09 09:57) [6]


> Kaginava   (09.07.04 09:16)  

конструктор класса TThread выполнятся в контексте вызывающего потока, поэтому к execute это никакого отношения не имеет.


> если в конструкторе потока запустить таймер то что тогда
> в
> методе Execute делать ?


покажите код тела execute тогда и будет понятно, что делать.


 
Digitman ©   (2004-07-09 10:11) [7]


> Kaginava   (09.07.04 09:31) [2]


> чтобы сервис отвечал на команды сервисменеджера основные
> действия должны выполняться в отдельном потоке, может я
> не прав.


не прав

сервис и так уже работает в доп.трэде сервис-процесса
другой вопрос, если трэд сервиса занят чем-то в какой-то момент времени, то он естественно не может реагировать в этот момент на сообщения, посылаемые ему.. поэтому длительные вычисления есть смысл выносить в доп.трэд .. но какое отношение к этому имеет таймер и зачем он вообще - вот это непонятно


 
Петров Денис ©   (2004-07-09 10:18) [8]

> Kaginava   (09.07.04 09:31) [2]

Таймер тебе точно не нужен. Реализуй что-то вроде этого:


procedure TSomeThread.Execute;
begin
 while not Terminated do
   begin
     ...
     // здесь выполняем какие-то действия
     ...
     // приостанавливаемся
     Sleep(1000);
   end;
end;


Кусок кода между begin и Sleep будет отрабатывать с периодичностью в 1 сек.


 
Петров Денис ©   (2004-07-09 10:19) [9]

А вот за это:


Self.Priority := tpHighest;


надо бить по рукам.


 
Kaginava   (2004-07-09 10:20) [10]

да, действительно таймер мне не нужен, я сам себя запутал.
Всем спасибо :))


 
Digitman ©   (2004-07-09 10:23) [11]

TJobService = class(TService)
...
 private
...
   procedure MsgSvcCtrl(var Message: TMessage); message SM_CONTROL;
...
 end;

...

procedure TJobService.ServiceExecute(Sender: TService);
var
 Msg: TMsg;
begin
 while not Terminated do
   begin
     WaitMessage;
     if PeekMessage(Msg, 0, SM_CONTROL, SM_CONTROL, PM_REMOVE) then
       Dispatch(Msg.Message)
     else
       ServiceThread.ProcessRequests(False);
   end;
end;

procedure TJobService.MsgSvcCtrl(var Message: TMessage);
begin
...
end;

отныне сервис оперативно реагирует как на команды сервис-менеджера так и на польз.сообщения SM_CONTROL, посланные трэду сервиса кем бы то ни было откуда бы то ни было вызовом PostThreadMessage()


 
han_malign ©   (2004-07-09 10:26) [12]

>А вот за это:
>Self.Priority := tpHighest;
>надо бить по рукам.
- а ничего не будет - у процесса-то приоритет обычный. Другое дело что сервис не будет отвечать на запросы(если sleep убрать), но это уже другие грабли...


 
Kaginava   (2004-07-09 11:56) [13]

пробовал так :
procedure TSomeThread.Execute;
begin
while not Terminated do
  begin
    ...
    // здесь выполняем какие-то действия
    ...
    // приостанавливаемся
    Sleep(1000);
  end;
end;


почему то действие в этом цикле выполняутся один раз при старте
сервиса и все , может кто объяснит почему ?


 
Digitman ©   (2004-07-09 12:20) [14]


> может кто объяснит почему ?


потому что "// приостанавливаемся" и ждем неизвестно чего до потери пульса


 
Kaginava   (2004-07-09 12:23) [15]

а почему до потери пульса если указано 1000мс ?


 
ZiRoCool   (2004-07-09 12:39) [16]

может я и не прав но вроде паузу лучше делать через WaitSingleObject, вот так:

var h: Thandle;
....
begin
....
   //Приостанавливаемся
   h:=CreateEvent(nil,true,false,"");
   WaitForSingleObject(h, 1000);
   CloseHandle(h);
....
end;


 
ZiRoCool   (2004-07-09 12:40) [17]

т.к. событие пустое, ничего не произойдёт, и задержка будет именно столько сколько указано



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.038 c
1-1089382420
Norfolk
2004-07-09 18:13
2004.07.25
TRadioGroup и файл


1-1089638314
serg128
2004-07-12 17:18
2004.07.25
Как открыть окно в определенных коовдинатах раб. стола?


4-1086088360
Stany
2004-06-01 15:12
2004.07.25
библиотека для программирования на API


4-1087307435
FlyDragon
2004-06-15 17:50
2004.07.25
Размер рисунка


14-1089197485
mfender
2004-07-07 14:51
2004.07.25
Беда с ICQ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский