Форум: "Основная";
Текущий архив: 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.033 c