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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
AntonSaburov
Дата 31.8.2004, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Плохо то, что лезем в базу данных в самом обработчике - эдак и зависнуть недолго smile.gif
А надо отстегивать тред.
PM MAIL WWW ICQ   Вверх
DarkDS
Дата 31.8.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Цитата(AntonSaburov @ 31.8.2004, 15:57)
Плохо то, что лезем в базу данных в самом обработчике - эдак и зависнуть недолго
А надо отстегивать тред

Не только база данных, но и посылка данных.
Самое минимальное - это то, что этот метод поставит колом ЭвентКью.
То есть весь ГУИ зависнет и не будет отображатся.
+ не очень хороший код - считываение данных в глобаную переменную и потом посылка этих данных. То есть возможно отсутвие синхранизации (что может вызвать деад лок)
smile.gif
PM MAIL   Вверх
Domestic Cat
Дата 31.8.2004, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



При запуске кода c GUI, запускается 2 потока : main и AWT диспетчер (я упрощаю, их больше).
Диспетчер держит эвент кю, занимается прорисовкой и вызовом соответствующих листенеров. Значит, код внутри actionPerformed быдет выполняться не main'ом, а диспетчером, и до его завершения GUI замерзнет. Правильно сделать так:
Код
<code id='javamI1MWE' name='java'>
// in actionPerformed
Thread thread = new Thread() {
public void run()
{
      establishDBConnection();
       retrieveData();
       establishNetworkConnection();
       sendData();
}
};
thread.start();
</code><script language='javascript' type='text/javascript'>highlightSyntax('javamI1MWE','java');</script>


DarkDS - запускаю... smile.gif

Please try again.

AntonSaburov

Please try again.

Это сообщение отредактировал(а) Domestic Cat - 31.8.2004, 17:31


--------------------

PM   Вверх
Alt
Дата 31.8.2004, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такие задания надо в ThreadPool отдавать имхо

Это сообщение отредактировал(а) Alt - 31.8.2004, 16:34
PM MAIL   Вверх
redrick
Дата 31.8.2004, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



эдак можно много потоков наплодить - а "много потоков автоматически означает лаги" (с) Domestic Cat
вроде как...

или у нас все таки только один ресурс ? (БД)

[off]
Цитата
DarkDS - запускаю...

Please try again.

Это сообщение отредактировал Domestic Cat - 31.8.2004, 16:33


там вероятность порядка 1/20 =))


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 31.8.2004, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(redrick @ 31.8.2004, 07:41)
там вероятность порядка 1/20 =))


точнее, 1/15. По-моему, нормально; нельзя же за каждый ответ + давать smile.gif

Может до 1/10 увеличить?

Цитата(redrick @ 31.8.2004, 07:41)
эдак можно много потоков наплодить - а "много потоков автоматически означает лаги" (с) Domestic Cat
вроде как...


Добавить 1, 2, 5 потоков для такого приложения можно практически безболезненно,
тем более что он все равно умрет после завершения. А вот замораживать GUI нехорошо smile.gif

% Да здравствует подсветка синтаксиса на форуме! adv/dance.gif


--------------------

PM   Вверх
Alt
Дата 31.8.2004, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Еще можно попытаться предотвратить многократные нажатия на ту волшебную кнопку

Код

// in actionPerformed
goButton.setEnabled(false);
Thread thread = new Thread() {
public void run()
{
     establishDBConnection();
      retrieveData();
      establishNetworkConnection();
      sendData();
      goButton.setEnabled(true);
}
};
thread.start();



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


Опытный
**


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

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



имхо это немного из другой оперы (можно ведь ещё ловить/пробрасывать ексепшены и т. п.)


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 31.8.2004, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(Alt @ 31.8.2004, 07:57)
Еще можно попытаться предотвратить многократные нажатия на ту волшебную кнопку


Вполне возможно, что goButton.setEnabled(false);содержится в establishDBConnection();
Поскольку это псевдокод, то обращать внимания на такие вещи не стоит smile.gif




--------------------

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


Новичок



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

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



Согласен smile.gif

Хотя помещать в establishDBConnection() что либо , кроме установления коннекта с БД, на мой взгляд, не очень правильно smile.gif

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Next

----------------------------------------------------------------------------------------------
Код

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Test extends JFrame implements ActionListener
{
   private JButton button;
   
   Test()
   {
       setSize(300, 400);
       JPanel panel = (JPanel) getContentPane();
       button = new JButton("Turn off the lights!");
       button.addActionListener(this);
       panel.add(button, BorderLayout.NORTH);
       panel.add(new JTextArea(10, 10), BorderLayout.CENTER);
       panel.add(new JTextField(10), BorderLayout.WEST);
       panel.add(new JButton("Some button"), BorderLayout.SOUTH);
       panel.add(new JButton("Button again"), BorderLayout.EAST);
       setVisible(true);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
   }

   public void actionPerformed(ActionEvent ae)
   {

   }
   public static void main(String[] args)
   {
       new Test();
   }
}


Убирать компоненты из контейнера нельзя.
Какой самый элегантный способ добиться следующего результата:
(Верхняя кнопка может оставаться как есть, не закрашенной.)

Это сообщение отредактировал(а) Domestic Cat - 31.8.2004, 17:29

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  screen.jpg


--------------------

PM   Вверх
ElectricalStorm
Дата 31.8.2004, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пока никто не написал я покажу самый не элегантый способ smile.gif

Код

   public void actionPerformed(ActionEvent ae)
   {
       for (int i = 0, size = getContentPane().getComponentCount(); i < size; i++)
       {
           Component c = getContentPane().getComponent(i);
           c.setBackground(Color.black);
           if (c instanceof JButton)
           {
               JButton jb = (JButton) c;
               jb.setBorder(null);
               jb.setFocusPainted(false);
           }
           else if (c instanceof JTextArea)
           {
               ((JTextArea) c).setBorder(null);
           }
           else if (c instanceof JTextField)
           {
               ((JTextField) c).setBorder(null);
           }
       }
   }



Это сообщение отредактировал(а) ElectricalStorm - 31.8.2004, 18:34


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 31.8.2004, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



ElectricalStorm

Please try again

smile.gif

Но есть способ гораздо проще - здесь, например, нужно перебирать все возможные варианты.



--------------------

PM   Вверх
ElectricalStorm
Дата 31.8.2004, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тоже самое только покороче smile.gif

Код

   public void actionPerformed(ActionEvent ae)
   {
       ((JButton)ae.getSource()).setFocusPainted(false);
       for (int i = 0, size = getContentPane().getComponentCount(); i < size; i++)
       {
           Component c = getContentPane().getComponent(i);
           c.setBackground(Color.black);
           if (c instanceof JButton)        
               ((JButton) c).setBorder(null);
           else if (c instanceof JTextArea)  
               ((JTextArea) c).setBorder(null);
           else if (c instanceof JTextField)
               ((JTextField) c).setBorder(null);
       }
   }



Это сообщение отредактировал(а) ElectricalStorm - 31.8.2004, 18:49


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 31.8.2004, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Ну нет smile.gif там подход иной должен быть.


--------------------

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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