Простая проблема с потоком - PullRequest
0 голосов
/ 29 ноября 2010

Все, что я хочу сделать, - это запустить поток для прослушивания связи через определенный порт.

Я начинаю это с кнопки 'ok' на jDialog.Когда нажата кнопка «ОК», jDialog должен спрятаться ( HostClientDialog.setVisible (false); ), который работает, когда там нет строки начала потока.

try {

            HostClientDialog.setVisible(false);

            // start a thread that listens for incoming messages
            new gameCycle().start();

} catch (Exception e) { }

В строке new gameCycle (). Start (); вызывается следующий код:

public class gameCycle extends Thread {

    //public gameCycle(){
      //  super();
    //}

    @Override
    public void run() {

        try {

            ServerSocket connection = new ServerSocket(4242);

            // Wait for connection
            Socket s = connection.accept();

            // Socket input
            BufferedReader in = new BufferedReader(new
                    InputStreamReader(s.getInputStream()));

            // for receiving moves
            while (true) {

                String message = "";

                message = in.readLine();

                if (message != null && !message.equals("")) {
                    // do something with message
                }

                sleep(100);

            } // end while

        } catch (Exception e) { }

    } // end run
} // end class

Я понял, что приведенный выше код цикличен до получения сообщения, а затем выполняючто-то с сообщением.Но когда вы выполняете этот код, окно jDialog создается снова (мгновенно) и повторно предлагает пользователю нажать ОК.Он не позволит пользователю пройти через окно jDialog, он просто будет постоянно их повторять.

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

РЕДАКТИРОВАТЬ (29.11.2010 в 1:30 AM EST)

Похоже, у меня не совсем есть идея об отключении TCP, как я и думал.Моя цель с потоком и последующим циклом while заключалась в следующем:

  • В фоновом режиме программа будет ожидать любые сообщения, отправленные в ее направлении
  • Если получит сообщение, оно получитобновите что-нибудь в графическом интерфейсе, а затем вернитесь к ожиданию новых сообщений

Все время, позволяя пользователю постоянно использовать графический интерфейс.

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Я понял, что вышеприведенный код зацикливался до получения сообщения

Не совсем.Эта строка:

Socket s = connection.accept();

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

Возможно, опубликуйте дополнительную информацию, например, как выглядит класс, запрашивающий соединение.

1 голос
/ 29 ноября 2010

Я бы сказал, что код, который вы указали, мне подходит.

Я бы реализовал возможность отмены всего потока вместо цикла с while (true). Вместо этого используйте логическое значение и сделайте логическое значение доступным для других потоков. Если тебе понадобится помощь, возвращайся ко мне.

Я думаю, что проблема заключается в коде, который мы НЕ видим здесь. Меня частично интересуют фрагменты кода, связанные с вызовом .start () в вашем потоке. Что происходит после этого?

ура

EDIT:

 public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    final JDialog dia = new JDialog();
    JButton btn = new JButton("Foo");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            dia.setVisible(false);
            Runnable t = new Runnable() {
                public void run() {
                    System.out.println("foo");
                }
            };
            t.run();
        }
    });
    dia.getContentPane().add(btn);
    dia.setSize(500, 400);
    dia.setVisible(true);
}
}

Это прекрасно работает для меня - извините, но я не могу воспроизвести ошибку, как вы заявили в комментариях. Пожалуйста, дайте больше кода, пожалуйста:)

РЕДАКТИРОВАТЬ # 2: Не устанавливайте какие-либо переменные прямо из вашего потока. Вместо этого используйте шаблон наблюдатель-слушатель. Когда поступает новое сообщение, пусть поток запускает propertyChangeEvent. http://download.oracle.com/javase/1.4.2/docs/api/java/beans/PropertyChangeListener.html

Может быть, вам стоит попробовать внедрить что-то более простое ... сначала быстро и легко поговорите. http://www.ashishmyles.com/tutorials/tcpchat/index.html

Когда у вас это получится, подумайте о своем проекте впереди. Может быть, чтение по многопоточности со свингом может помочь? http://java.sun.com/developer/technicalArticles/Threads/swing/

1 голос
/ 29 ноября 2010

выглядит хорошо, но я с подозрением отношусь к этому пустому блоку улова. Или, может быть, этот метод вызывается снова?

Также, если message == null, вы должны выйти из цикла чтения и закрыть сокет, и спящий режим бессмысленный: readline () заблокирует, если нет данных. И инициализация «сообщения» также не имеет смысла, когда вы собираетесь назначить его в следующей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...