Russian Qt Forum
Ноябрь 22, 2024, 23:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Клиент-сервер  (Прочитано 5200 раз)
blood_shadow
Гость
« : Август 28, 2011, 17:56 »

Добрый день,
стоит задача смоделировать взаимодействие клиентов (до 10) с сервером, короче суть такова:
клиенты и сервера находятся в разных потоках, клиенты посылают данные в очередь у каждого такого
запроса имеется приоритет, сервер изымает данные с очереди начиная с найвысшего приоритета

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

Спасибо
Записан
merke
Гость
« Ответ #1 : Август 29, 2011, 06:09 »

как вариант используй таймер, вместо бесконечного цикла.
Записан
ddrtn
Гость
« Ответ #2 : Август 29, 2011, 08:45 »

Как реализованы потоки? если с помощью QThread, то приблизительная схема примерно такова:

Код:
class MyThread: public QThread;
//..............................................................
MyThread::run()
{
  <инициализация обработчика>;
  exec();
}

Бесконечный цикл в обработчике не нужен.
Для опроса очереди можно использовать таймер с постоянным или плавающим интервалом опроса.
Однако, на мой взгляд лучше заставлять обработчики ловить сообщения от менеджера очереди о приходе данных.
Плюсы этого подхода - отсутствие необходимости периодического просмотра очереди. как следствие - сокращение постоянной нагрузки на проц.
Минусы - нужно реализовать менеджер очереди; нужно более сложное управление приоритетами;более сложная архитектура приложения;
Записан
blood_shadow
Гость
« Ответ #3 : Август 29, 2011, 18:49 »

как вариант используй таймер, вместо бесконечного цикла.
понял сделаю так:
клиенты с интервалом в 1 сек. шлют пакеты, сервер с интервалом 0.5 сек вытягивает их с очереди

вот такой вопрос - понятно что память на компе не "резиновая" и когда нибудь закончится, например
про ту же очередь (клиенты заполнят ее быстрее чем сервер будет тянуть пакеты), как лучше поступить в
данном случае? или просто сделать ограничение на 256 пакетов для очереди, по достижении которого
усыплять нити клиентов?
Записан
merke
Гость
« Ответ #4 : Август 29, 2011, 18:50 »

Это не тру, в худшем случае просто слетишь в файл подкачки)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 29, 2011, 19:41 »

Вроде бы я все это реализовал, но процессор грузится почти на 100% я так понимаю это из-за бесконечных циклов, как я понимаю необходимо добавить в каждый поток sleep(),
Ну sleep это никак не решение проблемы - нитки должны ждать на блокировках, или на атомарных локах.
Записан
blood_shadow
Гость
« Ответ #6 : Август 29, 2011, 21:00 »

Это не тру, в худшем случае просто слетишь в файл подкачки)
а чего не тру? 256 сильно много?
Записан
merke
Гость
« Ответ #7 : Август 30, 2011, 06:29 »

смотря какого размера пакет
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #8 : Август 30, 2011, 17:51 »

... но процессор грузится почти на 100% ...

А попробуйте скачать ВоркСпэйс с проектом Client Server

В проекте Client Server была заложена мнопоточность со стороны сервера
Для тестирование запускал очень много клиентов (пока не уперся в ограничения Windows 2003 Server на количество tcp соединения)

Мгу сказать, что сервер не грузил Сервер

ЗЫ Извините за тафталогию.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.