Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Tthread и внутренний цикл   Найти похожие ветки 

 
antonn ©   (2007-11-13 16:22) [0]

развейте мои сомнения:)
Создаю обычный Tthread, в Execute у него очень напряжный цикл while..do.
Процессор при расчете пытается загрузиться на полную катушку. Если я вставлю в тело цикла sleep(1) - приостановится поток tthread или главный поток программы?


 
Palladin ©   (2007-11-13 16:26) [1]

нет конечно


 
Kolan ©   (2007-11-13 16:27) [2]

> приостановится поток tthread

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

ЗЫ
 А попробовать слабо было?


 
Palladin ©   (2007-11-13 16:27) [3]

если sleep не в методе, который в Synchronize исполняется :)


 
Kolan ©   (2007-11-13 16:27) [4]


> приостановится поток tthread или главный поток программы

нет конечно
— в точку :)


 
Palladin ©   (2007-11-13 16:28) [5]

по мимо всего прочего можно выставить и приоритет потока


 
Palladin ©   (2007-11-13 16:29) [6]


> Kolan ©   (13.11.07 16:27) [4]

да это я вопрос не правильно воспринял
как: "приостановится ли поток VCL приложения" :)

невнимательно прочитал


 
antonn ©   (2007-11-13 16:50) [7]


> ЗЫ
>  А попробовать слабо было?

что попробывать? цикл перестал жрать процессорное время почем зря, и чего, я потому и спросил, правильно ли будет использовать слиип для отторможения тхреда? :) сомнения у меня :)
ну, насколько я понял, sleep(1) можно использовать для заморозки:) Спасибо:)

а еще вопрос, я сделал
TMooThread = class(TThread)
private
   Finterval:LongInt;
 protected
 public
   procedure SetInterval(const Value: cardinal);
 end;

правильно ли это вызвать SetInterval() у этого TMooThread, а то я с этими Synchronize() уже запутался %) Т.е. ничего, что я вызываю функцию напрямую?.. (не смейтесь:))


 
Anatoly Podgoretsky ©   (2007-11-13 16:56) [8]


> antonn ©   (13.11.07 16:22)  
> antonn ©   (13.11.07 16:50) [7]

Неправильно, ресурсы компьютера надо использовать на все 100%
Поэтому нечего процессор искуственно тормозить, что бы система гоняла холостой цикл.


 
Kolan ©   (2007-11-13 17:03) [9]

> Synchronize()

Все просто Synchronize() надо использовать, если хотите, чтобы код отработал в гл. потоке.

В основном опастность кроется в не потокобезопастных VCL компонентах. Поэтому с компонентами работают только в гл. потоке.


 
Сергей М. ©   (2007-11-13 17:05) [10]


> Т.е. ничего, что я вызываю функцию напрямую?


Это как ? Иллюстрируй в коде, если хочешь чтобы "не смейтесь"


 
antonn ©   (2007-11-13 17:10) [11]

а все, теперь разобрался:) запутался, что если из потока в главный нужно через Synchronize() лезть, то через какой _Synchronize() нужно из главного в потоке вызывать функции :)


> Anatoly Podgoretsky ©   (13.11.07 16:56) [8]
>
>
> Неправильно, ресурсы компьютера надо использовать на все
> 100%
> Поэтому нечего процессор искуственно тормозить, что бы система
> гоняла холостой цикл.

у меня там бесконечный цикл:
while not(terminated) do begin
       if not(PacingCounter-rPacingCounter<Finterval) then begin
             rPacingCounter:=PacingCounter;

             Synchronize(FOwner.DoTimer);
       end;

       PacingCounter:=GetTickCount;
       sleep(1);
end;

несложный таймер, без слипа ядро проца нагружается на 100%


 
Kolan ©   (2007-11-13 17:14) [12]

> Synchronize(FOwner.DoTimer);

Опять что-ли все в Synchronize? Что в DoTimer и кто есть FOwner?


 
Сергей М. ©   (2007-11-13 17:15) [13]


> запутался, что если из потока в главный нужно через Synchronize()
> лезть, то через какой _Synchronize() нужно из главного в
> потоке вызывать функции


Точно)... Абракадабра).. Запутаться в ней  - как два пальца..)..

Тебе накой хрен вообще тот самый "Synchronize" понадобился ?)
Патамушта так в тырнете написано ? Или куда ?)


 
antonn ©   (2007-11-13 17:21) [14]


> Kolan ©   (13.11.07 17:14) [12]
>
> > Synchronize(FOwner.DoTimer);
>
> Опять что-ли все в Synchronize? Что в DoTimer и кто есть
> FOwner?

всего лишь вызывает процедурку создания события с TNotifyEvent - таймер же :)
FOwner - указатель на родителя :)


> Сергей М. ©   (13.11.07 17:15) [13]
>
> ?)
> Патамушта так в тырнете написано ? Или куда ?)
>

да, блин, патамушта в тырнете написано, что работа с главным потоком программы (на vcl) из дополнительных производится в "Synchronize" %)


 
Leonid Troyanovsky ©   (2007-11-13 17:41) [15]


> antonn ©   (13.11.07 17:10) [11]

> несложный таймер, без слипа ядро проца нагружается на 100%

А зачем такой таймер? В учебных целях?

--
Regards, LVT.


 
Kolan ©   (2007-11-13 17:43) [16]

А где тяжелые вычисления я не пойму что-то, тут:
if not(PacingCounter-rPacingCounter<Finterval) then begin
            rPacingCounter:=PacingCounter;


?


 
antonn ©   (2007-11-13 17:45) [17]


> А зачем такой таймер? В учебных целях?
>

типа того:) нужен был таймер, который делал одинаковые паузы м/у вызовом большой процедурки в цикле. Ведь насколько я понял Synchronize() так же стопорит тхред пока не выполнится код в Synchronize, подрихтую и будет то, что нужно. А с обычным таймером, начитавшись споров "что будет если функция не успеет отработать и таймер сработает" не хочется связываться :)


 
antonn ©   (2007-11-13 17:45) [18]


> А где тяжелые вычисления я не пойму что-то, тут:

в Synchronize(FOwner.DoTimer);


 
DVM ©   (2007-11-13 17:48) [19]


> В основном опастность кроется в не потокобезопастных VCL
> компонентах. Поэтому с компонентами работают только в гл.
>  потоке.

В VCL потоконебезопасны не только компоненты, но и большинство остального кода, например из classes


 
Leonid Troyanovsky ©   (2007-11-13 17:51) [20]


> antonn ©   (13.11.07 17:45) [17]

> обычным таймером, начитавшись споров "что будет если функция
> не успеет отработать и таймер сработает" не хочется

Ну, а тебе ж таймер нужен только в промежутке, т.е., как сработал, то сначала выключили, затем вызвали процедуру.

А о каких интервалах речь?

--
Regards, LVT.


 
antonn ©   (2007-11-13 18:07) [21]


> DVM ©   (13.11.07 17:48) [19]
>
>
> В VCL потоконебезопасны не только компоненты, но и большинство
> остального кода, например из classes

ну и вызов процедуры из основного потока через Synchronize безопасна?


> Leonid Troyanovsky ©   (13.11.07 17:51) [20]
>
> Ну, а тебе ж таймер нужен только в промежутке, т.е., как
> сработал, то сначала выключили, затем вызвали процедуру.
>
>
> А о каких интервалах речь?
>
интервалы "обычные" - 100-50мсек.
да, была идея с отключением таймера TTimer и включением после, но ну его нафиг :) так в потоке я делаю еще переворот и масштабирование картинок (типа потоковое видео:)), все таки пусть оно тормозит в Тхреде, а в GUI небудет дерганий и прочей ерунды :)


 
DVM ©   (2007-11-13 18:10) [22]


> ну и вызов процедуры из основного потока через Synchronize
> безопасна?

Synchronize надо еще уметь применять и к месту. А то только проблемы получишь вместо выгоды.


 
Kolan ©   (2007-11-13 18:12) [23]

> А где тяжелые вычисления я не пойму что-то, тут:
>
> в Synchronize(FOwner.DoTimer);

Молодец, а нах тебе тогда поток?


 
antonn ©   (2007-11-13 18:46) [24]


> Молодец, а нах тебе тогда поток?



> так в потоке я делаю еще переворот и масштабирование картинок
> (типа потоковое видео:)),


 
Kolan ©   (2007-11-13 18:53) [25]

> А где тяжелые вычисления я не пойму что-то, тут:
>
> в Synchronize(FOwner.DoTimer);

Делая тяжелые вычисления в Synchronize ты делаешь их в осн. потоке.

Надо все делать в доп., а через Synchronize толко отображение&#133


 
antonn ©   (2007-11-13 19:06) [26]


> Делая тяжелые вычисления в Synchronize ты делаешь их в осн.
>  потоке.

угу. а переворот и ресайз делаю в самом потоке :)


 
Kolan ©   (2007-11-13 19:12) [27]

> угу. а переворот и ресайз делаю в самом потоке :)

В коде этого либо нет, либо я тебя не понимаю, либо ты меня.

Приведи код.

Если у тебя такой Execute:

procedure  Execute
while not(terminated) do begin
      if not(PacingCounter-rPacingCounter<Finterval) then begin
            rPacingCounter:=PacingCounter;

            Synchronize(FOwner.DoTimer);
      end;

      PacingCounter:=GetTickCount;
      sleep(1);
end;
end;

То ты все делаешь в осн. потоке так, как вызвал Synchronize.


 
Anatoly Podgoretsky ©   (2007-11-13 19:15) [28]

Таймер то зачем, потокам таймер не нужен, особенно TTimer


 
antonn ©   (2007-11-13 19:23) [29]


> В коде этого либо нет, либо я тебя не понимаю, либо ты меня.

я скилет написал с минимумом функций, только чтоб показать, где слип стоит :)
кода больше. Synchronize(FOwner.DoTimer); - это часть расчетов по подготовки к выводу непосредственно в ГУИшные классы/массивы и тп.


> Anatoly Podgoretsky ©   (13.11.07 19:15) [28]
>
> Таймер то зачем, потокам таймер не нужен, особенно TTimer

я тоже так думаю, поэтому TTimer у меня в потоке отсутствует %)


 
Leonid Troyanovsky ©   (2007-11-13 19:40) [30]


> antonn ©   (13.11.07 19:23) [29]

> я скилет написал с минимумом функций, только чтоб показать,
>  где слип стоит :)

Возьми мультимедийный таймер, он работает в отдельном потоке,
с хорошим разрешением и точностью.
Через заданный интервал он пустит твою процедуру путем PostMessage.
Процедура же будет исполнена в VCL потоке, синхронизация ей не нужна.

See msdn timeSetEvent.

--
Regards, LVT.


 
antonn ©   (2007-11-13 20:05) [31]

Leonid Troyanovsky ©   (13.11.07 19:40) [30]
я уже соеденил две штуки в одну :)
Был поток - в нем корячились картинки. Есть еще функция до подготовки и вывода картинок. И нужно интервалы вывода отделять друг от друга равными интервалами. Картинок разное кол-во за сеанс обработки и они выводятся разное время. Поэтому я пустил в том же потоке, где идет "синхронизе" бесконечный цикл, который выполняет роль таймера. Мне нужно то было узнать, могу ли я слиип запихнуть, чтоб цикл не жрал все время процессора, вот и все %)


 
Slym ©   (2007-11-14 04:25) [32]

antonn ©   (13.11.07 20:05) [31]
могу ли я слиип запихнуть

можно и с вантузом целоваться и ершик в зад засунуть, только зачем это тебе надо?
Sleep реально нужен только в исполнении Sleep(0) чтоб отдать системе неизрасходованый квант времени... Все остальное - Sleep(x) где х>0 костыли инвалиду


 
antonn ©   (2007-11-14 12:59) [33]

я, наверное, сейчас глупую вещь скажу - сколько квантов времени входит за sleep(1)? явно больше, чем sleep(0)... при (0) проц чуть меньше, но отжирает ресурсы. А с (1) - все мягко, некаких чрезмерных cpuussage, потому что системе отдается больше времени.


 
Сергей М. ©   (2007-11-14 13:04) [34]


> antonn ©   (14.11.07 12:59) [33]


Указав sleep(1) ты намеренно тормозишь свой поток.
Выбирай - или быстрей сделать работу или работать с постоянной оглядкой на "нагрузку проца".


 
antonn ©   (2007-11-14 13:10) [35]


> Указав sleep(1) ты намеренно тормозишь свой поток.

именно, когда пустой цикл я его притормаживаю, иначе он прытко начинает следующий виток.


 
Сергей М. ©   (2007-11-14 13:12) [36]


> когда пустой цикл я его притормаживаю


А за каким лешим гонять холостой цикл ?


 
antonn ©   (2007-11-14 13:13) [37]


> А за каким лешим гонять холостой цикл ?

часть таймера, блин :)
только не спрашивай "зачем", там чуть выше говорилось :)


 
Сергей М. ©   (2007-11-14 13:15) [38]


> часть таймера


Какого еще нафих таймера ?
Нет у тебя в нити никакого таймера - просто бесполезный цикл.


 
Slym ©   (2007-11-14 13:17) [39]

Сергей М. ©   (14.11.07 13:15) [38]
Ни чего ты не понимаешь в колбасных обрезках :)
это такой супер-пупер мультимедиа-атомный таймер...


 
antonn ©   (2007-11-14 13:18) [40]

:)))) Мысли шире, таймер это не только TTimer :)
пустой цикл - таймер, в котором после истечения определенного временного ромежутка вызывается "синхронизе", который выгружает массивчик один в ГУИшные процедурки. Так же в потоке ведется несложная обработка некоторых вещей, для которых sleep(1) - ерунда



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

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

Наверх




Память: 0.57 MB
Время: 0.031 c
8-1170612314
Master_
2007-02-04 21:05
2007.12.09
Как узнать имя кодека, которым сжат видеофайл


4-1179894213
Klopan
2007-05-23 08:23
2007.12.09
Включение флешки


15-1194525911
Sonia
2007-11-08 15:45
2007.12.09
Может еще кто-то помнит Фортран....


2-1194880387
Новичок
2007-11-12 18:13
2007.12.09
Как правильно организовать связь между таблицами


8-1170734577
avprohorov
2007-02-06 07:02
2007.12.09
как перерисовать только Image