Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите снизить нагрузку на ЦП, при использования цикла! 
V
    Опции темы
elestrago
Дата 27.10.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



в общем ситуация такая передаю файлы через сеть при момощи отдельного потока!

для создания потока использую класс TThread

данные передаются в цике до тех пор пока позция FileStream не дойдет до конца файла!

при этом нагрузка на цп сразу взлетает  до 50%

вот как примерно все это выглядет

Код
            
      Fstream:=TFileStream.Create(Pchar(list.SubItems[1]), fmOpenRead or fmShareDenyWrite);
            if Fstream <> nil then
              begin
                while Fstream.Position <> Fstream.size do
                  begin
                    startpos:=Fstream.position;
                    R := Fstream.Read(Buffer, SizeOf(Buffer));
                    if R > 0 then
                      begin
                        LenSend := send(Fsocket,Buffer,R,0);
                  .... там дальше пошла обработка ошибок и прочее


Впринцепе выход из этой ситуации прилепить в этом цикле sleep(1) но это дико снижает скорость передачи данных, посоветуйте как грамотно снизить нагрузку на цп

заранее спасибо
--------------------
PM MAIL ICQ   Вверх
Matematik
Дата 27.10.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Какой  размер буфера?
PM MAIL WWW ICQ   Вверх
Akella
Дата 27.10.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



а что за проц? может просто  он слабый или памяти мало?
PM MAIL   Вверх
Poseidon
Дата 27.10.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Как вариант, можно уменшить приоритет потока, но это так же может сказаться на скорости передачи.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
elestrago
Дата 27.10.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



Buffer: array[0..10240] of char;


а насчет проца он не слабый 3,2 пентиум

Добавлено через 2 минуты и 1 секунду
приоритет потока не как не влияет, проц загружается так же как и раньше я пробовал!
--------------------
PM MAIL ICQ   Вверх
Coder
Дата 27.10.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



elestrago, а размер файла какой? попробуй прогнать программу с заглушкой send(). да и буффер нужно уменьшить все равно при передаче в один пакет он не влезет.
PM MAIL   Вверх
AntonN
Дата 27.10.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



в тело цикла воткни sleep(1) или так и будет нагружать smile

Это сообщение отредактировал(а) AntonN - 27.10.2008, 15:41


--------------------
user posted image
PM MAIL WWW   Вверх
Sajtran
Дата 27.10.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.10.2008
Где: Мегион

Репутация: 2
Всего: 2



по пробуй по играть с буферами кратными 2^9=512 байт

PM MAIL   Вверх
elestrago
Дата 27.10.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



Все проблему решил, засчет того что увеличил буфер и воткнул в цикл sleep

всем спасибо smile
--------------------
PM MAIL ICQ   Вверх
Virtuals
Дата 27.10.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



elestrago, а sleep то зачем? smile может надежней использовать неблокирующий режим, и работать по событиям?

ЗЫ приведи код полнее непонятно что у тебя за сокеты
PM MAIL ICQ   Вверх
elestrago
Дата 27.10.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



Цитата(Virtuals @ 27.10.2008,  18:46)
elestrago, а sleep то зачем? smile может надежней использовать неблокирующий режим, и работать по событиям?

ЗЫ приведи код полнее непонятно что у тебя за сокеты

работаю с блокирующими сокетами, а вот насчет событий я не уверен что мне было бы удобнее! 

Зы ты думаеш если передавать данные в неблокирующем режиме то нагрузка спадет чтоли?
--------------------
PM MAIL ICQ   Вверх
Poseidon
Дата 27.10.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Virtuals @  27.10.2008,  18:46 Найти цитируемый пост)
elestrago, а sleep то зачем?
Ты не знаешь что означает Sleep в потоке? Sleep сообщает ОС что текущий поток не нужнается в дополнительных циклах процессора в течении определенного количества миллесекунд. При передаче в качестве параметра в Sleep значения, равного 0 (или 1, как в данном случае), ОС передает процессорные циклы одному из ожидающих потоков равного или высшего приоритета. Таким образом удается избежать ситуации, когда один поток захватывает все процессорное время.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Virtuals
Дата 28.10.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



Poseidon, я отлично знаю что такое sleep, так что умничать сдесь не очень к месту, 
я нифига не понял зачем это тут!.

elestrago, 
Цитата

Зы ты думаеш если передавать данные в неблокирующем режиме то нагрузка спадет чтоли?

100%
в блокирующем режиме ты понятия не имееш сколько понадобится времени на передачу твоих данных
и у тебя осталось 2 варианта
1. сидеть в глухом цикле, и занять все свободное процессорное время на себя (при этом нагрузка на цп сразу взлетает  до 50%) как я понял у тя проц двухьядерный smile 
2. сунуть этот sleep и подождать какое-то время, совершенно ничего не делая
отсюда
в вариантах
1. скорость передачи будет почти макс, но ... недостатки ты и сам знаеш
2. скорость напрямую зависит от того как ты удачно угадал время (дабы в sleep сунуть) затраченное на передачу твоего блока данных и на промежуточные расходы, типа файловых операций и т.д.

а вот в неблокирующем режиме
1.ты отдаеш данные на передачу
2. пока они передаются, читаеш новый блок данных, и спокойно ждеш (в обработчике событий, и никаких sleep) события что можно сунуть новый блок.

+ы процессорное время занимается ровно столько сколько нужно, и никаких левых задержек, ланные передаются с той скоростью, сколько может сжевать сетевой интерфейс

PM MAIL ICQ   Вверх
elestrago
Дата 30.10.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



хм интересно smile надо будет опробовать твой вариант с неблокирующими сокетами! 

Спасибо всем за ответы!! теперь тема точно закрыта smile
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.