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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.101 c
15-1193990034
@!!ex
2007-11-02 10:53
2007.12.09
Как вытащить данные?


15-1194543809
@!!ex
2007-11-08 20:43
2007.12.09
Настройка марщрутизатора


2-1195122648
San1
2007-11-15 13:30
2007.12.09
как избавиться от зависания


1-1190102028
Darvin
2007-09-18 11:53
2007.12.09
Посоветуйте, как реализовать


11-1180516338
=BuckLr=
2007-05-30 13:12
2007.12.09
RE_Text и UNICODE_CTRLS





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