![]() |
|
Модераторы: feodorv |
![]()
|
|
| max0257 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 30.10.2006 Репутация: нет Всего: нет |
Здраствуйте,
В своем сетевом приложении хочу организовать управление количеством отправляемых по TCP-соединению сообщений. Я пробовал использовать разделяемую переменную с таймером, который ее обнулял, но получилась ерунда. У кого-нибудь есть идея как это сделать правильно? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: нет Всего: 98 |
не совсем прнятно что такое
и для чего это... но идея с таймером вполне нормальная. P.S. что эта тема делаей в этом разделе? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| max0257 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 30.10.2006 Репутация: нет Всего: нет |
Смысл следющий - клиент по TCP соединяется с сервером и отсылает на него бинарные сообщения. Я пытался организовать отправку с контролем скорости следующим образом - один объект содержит счетчик и таймер, который раз в секунду обнуляет его. Поток, который пишет в соединение каждый раз проверяет число счетчика, если оно небольше чем максимально допустимое, то сообщение отправляеться и счетчик увеличивается на 1. Соответственно таймер тикает раз в секунду и сбрасывает счетчик в ноль. Может существует алгоритм, который организует это проще?
<code> class CGauge: public ACE_Event_Handler { public: CGauge(); virtual ~CGauge(); void Nullize(); int handle_timeout(const ACE_Time_Value& tv,const void *arg = 0); void Inc(); int GetCnt(); private: int _cnt ; ACE_Thread_Mutex _nullize_mutex; }; CGauge::CGauge() { _cnt = 0 ; ACE_Time_Value tv (1, 0); ACE_Reactor::instance()->schedule_timer(this,0,tv,tv); } CGauge::~CGauge() { ACE_Reactor::instance()->remove_handler(this,ACE_Event_Handler::DONT_CALL); } void CGauge::Nullize() { _nullize_mutex.acquire(); _cnt = 0; _nullize_mutex.release(); } void CGauge::Inc() { _nullize_mutex.acquire(); ++_cnt; _nullize_mutex.release(); } int CGauge::handle_timeout(const ACE_Time_Value& tv, const void *arg) { //ACE_DEBUG((LM_DEBUG,"%T Gauge nullizing\n")); this->Nullize(); return 0; } int CGauge::GetCnt() { int r; _nullize_mutex.acquire(); r = _cnt ; _nullize_mutex.release(); return r ; } </code> |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |