Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Tthread и внутренний цикл


Страницы:   1 2 3

antonn ©   (2007-11-13 16:22:00) 

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


Kolan   (2007-11-13 19:12:00) [21]

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

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

Приведи код.

Если у тебя такой 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.


antonn   (2007-11-13 19:06:00) [22]


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

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


Kolan   (2007-11-13 18:53:00) [23]

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

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

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


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


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



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


Kolan   (2007-11-13 18:12:00) [25]

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

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


DVM   (2007-11-13 18:10:00) [26]


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

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


antonn   (2007-11-13 18:07:00) [27]


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

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


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


Leonid Troyanovsky   (2007-11-13 17:51:00) [28]


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

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

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

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

--
Regards, LVT.


DVM   (2007-11-13 17:48:00) [29]


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

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


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


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

в Synchronize(FOwner.DoTimer);


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


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

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


Kolan   (2007-11-13 17:43:00) [32]

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


?


Leonid Troyanovsky   (2007-11-13 17:41:00) [33]


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

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

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

--
Regards, LVT.


antonn   (2007-11-13 17:21:00) [34]


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

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


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

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


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


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


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

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


Kolan   (2007-11-13 17:14:00) [36]

> Synchronize(FOwner.DoTimer);

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


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

а все, теперь разобрался:) запутался, что если из потока в главный нужно через 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%


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


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


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


Kolan   (2007-11-13 17:03:00) [39]

> Synchronize()

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

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


Anatoly Podgoretsky   (2007-11-13 16:56:00) [40]


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо