Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/20: Рейтинг темы: голосов - 20, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9

WinSock и 100%-ная загрузка CPU

01.09.2010, 19:02. Показов 4058. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Кто-нибудь знает, как снизить загрузку проца при длительном приеме (передаче) данных через WinSock, а то у меня уже при 8-ти работающих экземплярах Winsock'а, связанных с восемью разными компами (я пытаюсь сделать один распределенный алгоритм...) процессор загружен на 100% (!) и все восемь экземпляров начинают работать с периодическими остановками в приеме (передаче) данных. Причем, сам объем передаваемых данных невелик: клиент отсылает строку (из двух символов) серверу, а сервер, приняв эту строку, выполняет некоторое действие над ней и отсылает модифицированную строку (2 символа) клиенту, затем в цикле процесс повторяется снова, но уже со строкой других данных. Связь клиента и сервера должна поддерживаться постоянно.
Пробовал экспериментировать и вместо OCX-компонента WinSock'а использовал API - результат тот-же! Может это такая особенность VB6 пожирать ресурсы при работе WinSock? Для сравнения: всем известный RemoteAdministrator (версии 2.1) при передаче целого экрана (!) удаленной машины с частотой сканирования 100 раз в секунду при 65536 цветах съедает всего лишь 3-5% ресурсов проца. Если кто знает, как с этим бороться - подскажите!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.09.2010, 19:02
Ответы с готовыми решениями:

100%-ная загрузка ЦП
каждый раз когда я пытаюсь что то делать ЦП загружается до 100%..например,скачал программму монтажер,с ее помощю хотел редактировать...

100%-ная загрузка процессора
1. После 10-15 мин загрузки проц загружает на 100% services.exe (SYSTEM), убить его диспетчер не может говорит это критический системный...

100%-ная загрузка процессора
После установки драйверов на GeForce GT 240,загрузка процессора становится 100% всё время.(На чистый, отформатированный хард) Данная...

20
Messir
02.09.2010, 01:52
попробуй использовать udp-протокол
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
02.09.2010, 12:58  [ТС]
UDP протокол использовать нежелательно, т.к. нужна гарантированная доставка данных.
Но дело даже не в протоколе: просто удивительно, что никто не столкнулся с длительной передачей данных посредством WinSock.
0
Messir
03.09.2010, 13:52
Ну, реализуй работу с сетью не на VB. Передать пару байт во внешнюю функцию - не проблема. К тому же, желательно использовать мультитрединг.
Comanche
03.09.2010, 21:21
Посмотри ссылочку:
http://www.vbnet.ru/sample/sampledownload.asp?id=288

Не знаю - то ли это, что тебе нужно, но на всякий случай
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
05.09.2010, 20:40  [ТС]
За ссылку - спасибо, но как оказалось, там элементарный пример.
Насчет MultiThreading - уже пробовал использовать (через ActiveX EXE), но внутри каждой создаваемого потока сидит ТОТ ЖЕ тормозной WinSock и по-прежнему тормозит!!! Замену до сих пор ему не нашел.

Кто еще чего может посоветовать??? Где только не смотрел, ничего пока не нахожу! Неужели никто не сталкивался с таким эффектом у WinSock'а?

Кстати, кажись дельная идея Messir насчет реализации работы с сетью не на VB... Может у кого есть ссылки, предложения. Буду весьма признателен за совет!
0
Messir
06.09.2010, 02:00
Мультитрединг через ActiveX EXE?! )) ЛОЛ!!!
ActiveX - это вообще в данном случае тормозная лажа, применение которой не оправдано. Поэтому забей на него в принципе. Реализую мультитрединг через CreateThread, в процедуре треда юзай API для работы с сетью.
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
06.09.2010, 06:59
Да, действительно.
Тоже столкнулся с проблемой длительной передачи данных через Winsock
Как ни странно, но теряю данные в сети, а прога очень чувствительна к порядку переданной информации. Как решить ? Думаю, нужно пробовать создать два соединения. Одно передает данные, второе в качестве контроля ИМХО.
0
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
07.09.2010, 14:38  [ТС]
Приветствую тебя, PMSSpy !

Твоя проблема с потерей данных в сети, как мне кажется, немного проще, чем моя. Попробую тебе предложить два варианта:
ВАРИАНТ ПЕРВЫЙ.
шаг1: клиент передает серверу блок твоих данных, причем (ВАЖНО!) в конец этого блока дописывает нечто вроде идентификатора данного блока (в качестве идентификатора я использую число типа Long, начинающееся с префикса (символа S), означающего источник блока данных, т.е. сервер), причем значение идентификатора у каждого следующего передаваемого блока будет увеличиваться на 1. Этот идентификатор сохраняется в отдельной переменной (до шага 3).
шаг2: сервер, приняв ЭТОТ блок данных, берет его идентификатор и обратно клиенту отправляет нечто вроде подтверждения, в котором содержится идентификатор только что принятого блока.
шаг 3: клиент, получив это подтверждение, берет из него идентификатор и сравнивает его с отправленным идентификатором и если они совпадают, то значит, что блок данных ДОШЕЛ НОРМАЛЬНО и можно отправлять следующий блок!
Такая процедура гарантирует сохранность отправленных данных, но важно, чтобы идентификатор отправляемого блока никогда больше не повторялся, т.е. был уникальным.

ВАРИАНТ ВТОРОЙ.
Чтобы данные не терялись, можно перед отправкой блока данных проверять состояние WinSock'а: если WinSock.State=7, то отправлять можно. Фрагмент кода:

Do While (Not WinSock.State=7)
DoEvents
Loop
WinSock.SendData БлокДанных

Но такой метод имеет недостатки, о которых здесь уже говорилось: сильная загрузка проца из-за цикла Do...Loop

Удачи!
0
Messir
07.09.2010, 15:16
Нет, господа. Что-то вы не так делаете...
Поскольку _гарантированная_ доставка данных задожена в протокол TCP изначально. И, например, у меня ни разу не возникало ситуации, чтобы пакеты терялись (выдергивание сетевого кабеля в момент передачи не считается... )
посему рекомендации:
1. Отказаться от использования компонента WinSock вообще
2. Если работа действительно длительная, то разумнее, мне кажется, было бы выделить работу с сетью отдельной службой
3. В любом случае, реализовывать работу с сетью лучше не на VB.
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
07.09.2010, 16:14  [ТС]
Два вышеприведенных варианта мною были даны PMSSpy из-за того, что протокол-то конкретно не был указан!
Ну а если речь пойдет про TCP, то действительно, это протокол с гарантированной доставкой, а блоки данных могут теряться из-за того, что отправка блока от клиента происходит тогда, когда сервер еще не успел завершить прием предыдущего блока. И чтобы исключить это, мне кажется, надежнее всего делать подтверждение приема блока данных сервером, что и было описано мной...

Но основной-то вопрос не решен - почему полностью загружается проц?
Мною уже были перепробованы следующие решения:
1) отказ от использования WinSock'а и переход на API. Результат тот же.
2) работа с сетью выполнялась в отдельном потоке. Результат тот же.
3) полное исключение использования циклов Do...Loop и переход на событийное управление.

Если кто порекомендует, где найти готовую библиотеку или OCX, написанные на C, C++, то думаю, это единственное, что осталось не проверенным. Если знаете где, киньте ссылку!
0
Messir
07.09.2010, 16:19
Смотря что подразумевать под 'готовой библиотекой'. Вообще, если прога маленькая и преобразования указанных 'двух байт' достаточно простые, я бы вообще отказался от использования VB. В данном случае лучше было бы писать на асме или сях...
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
07.09.2010, 16:33
У меня событийная схема:

схема пакета данных
Prog_ID (string*ZZZ)
Mode_ID (byte)
From_ID (dword)
To_ID (dword)
Data (255 bytes)
End_of_block_ID = chr(0) или chr(1) по случаю

т.е. стоиться все так:
приходит пакет (произвольный)
копируем его в переменную
проверяем, есть в переменной Prog_ID ?
Нет -> выход из процедуры
Да! -> выделяем из переменной пакет и направляем на обработку другой процедуре.
Процедура обрабатывает режим передачи (byte Mode_ID) и в зависимости от него узнает, что за данные пришли, от кого и кому (тоже сравнивается)

Кстати, в качестве окончания используется chr(0) иначе chr(1) означает, что передача данныых еще не завершена и будет продолжена.

Вот где-то здесь теряются данные на клиенте. Подскажите, или вам сам код выложить?
0
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
07.09.2010, 17:01  [ТС]
Про 'два байта' - это, конечно, сильное упрощение. В реальности под двумя байтами понимается блок данных длиной от 32 до 64 байт (что тоже не слишком много). Но дело даже не в этом, а в том, что когда их передача начинает происходить более-менее НЕПРЕРЫВНО, то исчерпываются все ресурсы проца. И это только ОДИН экземпляр WinSock!
А если этих экземпляров будет штук десять?
У меня комп PIII-733/ОЗУ 512МБт, сеть 100МБит и уже при пяти запущенных WinSock'ах, связанных с пятью разными машинами, в режиме НЕПРЕРЫВНОЙ передачи (БЕЗ ЦИКЛОВ!) все пять WinSock'ов начинают бултыхаться: один вроде бы передает, второй снижает скорость, третий молчит; потом первый затыкается, второй передает по байту в несколько секунд и т.д. и т.п! О запуске новых WinSock'ов и речи нет: грузятся минуты три!!! А затем начинают работать все вместе так, как и первые пять. Налицо ситуация, когда НЕТ СВОБОДНЫХ РЕСУРСОВ ПРОЦА! Их забирает (или забирают) работающие WinSock'и!
Код нормальный, циклы отсутствуют: вместо цикла я использую событие DataArrival для того, чтобы передать следующий байт, когда придет блок-подтверждение того, что все дошло нормально (пример см. выше) и только после этого отправляю следующий байт (или байты, если быть точнее). Использую событие и циклы сами собой отпадают.
В моей ситуации сеть загружена по-минимуму, но этот WinSock...

Последнее остается: работу с сетью делать не на VB. Но асма и С не знаю, поэтому прошу что-нибудь подсказать из готовых модулей/библиотек/компонент. Чтобы можно было подключить к проекту и не морочить голову.
Кстати, пробовал использовать Pipes, пример с которыми есть на VBrussian. Работает в пределах локальной машиы (сервера висят на разных портах) вроде бы хорошо, но и тут облом: по сети не коннектится, хотя у предложенного компонента есть свойство ServerName, которое позволяет читать или устанавливать имя сервера, на котором открыта Pipe, с которой нужно установить соединение. В общем, халтура. Хотя в MSDN уверяют, что мол только замените '.' на имя удаленной машины и все будет OK!
0
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
07.09.2010, 17:04  [ТС]
Попробуй выложить код, поглядим
0
Comanche
07.09.2010, 18:04
видел где-то в сети VB-проектик 'MultiDownloader' (или что-то близко к этому): там сделан многопоточный загрузчик с FTP, 'a la FlashGet'. вроде работала эта штука нормально... может, вам стоить найти её и посмотреть, как она сделана? - благо проект идёт с исходниками.
(увы, рад бы помочь, да не сохранил ни исходники этого проекта, ни ссылку на его загрузку ( )
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
08.09.2010, 13:40
участникам переписки сбросил файл с клиент-сервером на почту.
иным - ссылку даю http://www.pmsspy82.narod.ru/client-server.zip
0
0 / 0 / 0
Регистрация: 01.09.2010
Сообщений: 9
09.09.2010, 19:19  [ТС]
Похоже, эта ссылка - несуществующая.
0
Виталиум
10.09.2010, 14:31
Неправильно вы гоните на winsock!
он круче всех api! )

У меня программа (Network Communicator, www.communicator.net.ua)
работает одновременно с 2-36 экземплярами winsock и не тормозит вообще! Даже броадкаст используется!

Главное правило везде использовать проверку на winsock1.state = 7
и везде вставлять doevents.
Последняя команда делает паузу где-то от 70 до 100 милисек и позволяет ОС отвлечься на другие процессы.

Особенно важно юзать ее в цикле do ... loop и других.
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
12.09.2010, 08:20
to x-jek: скинь мне свой е-мейл, я тебе вышлю свой проект.
вся инфа с моем профиле
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.09.2010, 08:20
Помогаю со студенческими работами здесь

100%-ная загрузка процессора в играх
В играх процессор грузится на 80-100%.Проверял на вирусы 2 трояна нашёл удалил.Всё начилось когда установил batman archam city,у меня не...

100%-ная загрузка системного диска
Нагрузка на системный диск время от времени 100%. Все начинает страшно тормозить... Системный диск представляет собой Диск разбитый на 2...

100%-ная загрузка ЦП после переустановки Windows
Здравствуйте, у меня AMD athlon 64 x2 dual core 4400 2,29 гигагерц. Память ddr2 6 гигобайт. Была 100% процентная загрузка процессора...

100%-ная загрузка ЦП файлового сервера (W2k)
На нем 350 юзеров и 1000 открытых файлов .dbf Оптимизация на уровне служб Идет интенсивная запись в фалы в каждую минуту, нагрузка...

100%-ная загрузка жесткого диска ноутбука
На ноуте загрузка 100 жесткого диска, хотя процессов вроде нет, подскажите что делать, windows 8.1 лицензионная


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru