Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка событий и запись в сокет 
V
    Опции темы
Ortega
Дата 16.7.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

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



Есть панель, на которой драгом рисуется нечто. По отпусканию мыши данные ставятся в очередь потоку, который их отсылает в сокет.
Так вот, на время отправки данных обработка событий блокируется. Причем если убрать отправку данных и поставить какой-нибудь цикл на несколько тысяч итераций, например, то такого не происходит. Почему такое происходит, понять не могу, может кто подскажет? 
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
LSD
Дата 16.7.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Обработка каких событий, GUI?
Да и код в этом случае не помешало бы показать. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ortega
Дата 16.7.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

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



Собственно не обрабатываются события от мыши и перерисовка. 
Насчет кода, если будет время, выдерну нужный кусок. Просто, может кто с этим уже сталкивался? 
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
boevik
Дата 17.7.2006, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

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



Поставь отправку данных в отдельный thread.
Какой-нибудь цикл на несколько тысяч итераций может выполняться очень быстро. 


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Ortega
Дата 17.7.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 5.11.2005
Где: Харьков, Украина

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



Цитата(boevik @  17.7.2006,  07:22 Найти цитируемый пост)
Какой-нибудь цикл на несколько тысяч итераций может выполняться очень быстро.  

Я соврал немного насчет нескольких тысяч. 
Код

for (int i = 0; i < Integer.MAX_VALUE; ++i) {
  System.out.println(i);
}


Но проблему уже решил. Дело, как я и подозревал, заключалось в блокировке при синхронизации. Но на стороне сервера.
На сервере происходило следующее:
Читающий поток считывал данные и ставил их в очередь потоку-обработчику. И вот здесь я себе организовал неплохой подводный камень, поскольку обработчик был реализован след образом: 
Код

public class PageWorker extends Thread {
  
  public synchronized void sendCommand(byte commandCode, byte[] data) {
    // добавляем в очередь
    this.notify();
  }

  public synchronized void pushCommand() {
    while (true) {
      try {
        Byte sCommandCode;
        Integer sDataSize;
        ByteArrayInputStream sData;
        if (spool.size() == 0)
          this.wait();
         // читаем из очереди
        // обработка данных

      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      ;
    }
   }
    public void run() {
      this.pushCommand();
    }
}


естесственно, пока все пакеты в очереди не будут обработаны, добавить новые невозможно. Поэтому читающий поток и приостанавливался, ожидая окончания обработки предыдущего пакета. Следовательно, чтение данных из сокета откладывалось, пока не будет обработан предыдущий пакет. И это почему-то вешало клиент.

Добавлено @ 11:29 
А проблема была решена модификацией метода:
Код

public void pushCommand() {
    while (true) {
      try {
        Byte sCommandCode;
        Integer sDataSize;
        ByteArrayInputStream sData;
        synchronized(this) {
          if (spool.size() == 0)
            this.wait();
           // читаем из очереди
        }
        // обработка данных

      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
}
 

Это сообщение отредактировал(а) Ortega - 17.7.2006, 11:28
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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