Какая часть моего кода находится в очереди отправки событий - PullRequest
2 голосов
/ 15 октября 2011

Я думал, что понял EDQ, пока не столкнулся с этой проблемой. У меня есть код, показанный ниже. Это читает от Буферного читателя. Если первый полученный символ - «Z», я выполняю один набор кода (отображающий JOptionPane), а если это 0, я выполняю другой раздел кода (отображающий другую JOptionPane). Я пытаюсь сделать это в EDQ, и поэтому я использую SwingUtilities invokeAndWait. Когда я тестирую эти условия ошибки, первый оператор в условном выражении работает как задумано, но я получаю ошибку Java при тестировании предложения else. В частности:

Исключение в потоке "AWT-EventQueue-2" java.lang.Error: Невозможно вызвать invokeAndWait из потока диспетчера событий at java.awt.EventQueue.invokeAndWait (неизвестный источник)

Это все часть одного и того же условия. Как один пункт может быть частью EDQ, а другой - нет.

Это безумие.

Спасибо за любую помощь.

Эллиот

     while ((line = in.readLine()) != null) {
        if (line.charAt(0) == 'Z') {
            String theMsg;
            theMsg = "No records were found.";
            try {
                SwingUtilities.invokeAndWait(new DoShowDialog(null, theMsg, 0));
            } catch (java.lang.reflect.InvocationTargetException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            noDocs = true;
            Object args[] = new Object[1];
            args[0] = "1";
            window.call("uploadConfig", args);
            downloadAccount.setEnabled(true);
            uploadAccount.setEnabled(false);
            deleteAllUnselectedCodes.setEnabled(false);
            queue = null;
            if (poll) {
                polltimer.restart();
            }
        } else if (line.charAt(0) == 'O') {
            String theMsg;
            theMsg = "Account is currently checked out 
            by user "+ line.substring(1)
            + ".  You can view this 
            account but you cannot modify it. ";
            try {
                SwingUtilities.invokeAndWait(new DoShowDialog(null, theMsg, 0));
            } catch (java.lang.reflect.InvocationTargetException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            initialckBoxState = false;
            accountfoundandnotcheckedout = true;
            viewMode = true;
            patientpane.setEditFields(false);
            otherpane.setEditFields(false);
            getAccountImages(acctEntered); // bluenoble
        }
        .....................
        more stuff
    }

Ответы [ 3 ]

5 голосов
/ 15 октября 2011

Выполнение не пересекает потоки.

Таким образом, весь опубликованный код выполняется в EDT (Поток отправки событий), и он отказывается invokeAndWait, потому что это вызывает внутреннюю тупиковую ситуацию.(На самом деле, его можно превратить в немедленный вызов, как это было сделано с SynchronizationContexts в .NET, но он не был спроектирован как таковой.)

В этом конкретном случае я подозреваю, что код вызывается из в обратный вызов EDT (и copy'n'pasted из другого сценария).«Тривиальное исправление» (которое устранит это исключение) будет заключаться в устранении методов invokeAndWait, но это будет иметь негативное влияние, если этот код также будет вызываться из EDT - эти две ситуации будут обрабатываться по-разному.Потратьте некоторое время, чтобы определить , когда / где этот код будет выполняться и почему.

Как уже отмечали другие, этот код кажется запутанным: если он выключен EDTманипулирование объектами Swing - это плохо, и если это на EDT, тогда нет необходимости invokeAndWait и блокировка плохая.

Удачное кодирование.

2 голосов
/ 15 октября 2011

если это в конечном итоге вызывается из обработчика событий, то он вызывается из EDT (весь ваш код будет, если вы не используете SwingWorkers или явно не создаете thread / use threadpools)

проверить трассировку стека, чтобы найти, откуда она взята

, чтобы исправить это, используйте вышеупомянутый SwingWorker и переопределите doInBackground (), и вы можете проверить, находитесь ли вы в потоке отправки с помощью SwingUtilities.isEventDispatchThread()

1 голос
/ 15 октября 2011

1) theMsg выглядит как сумасшедший theMsg = "someString" + localVariable + "anotherString"

2a) почему вы вызвали Swing GUI внутри ввода / вывода Basic File

2b) почему вы создали GUI внутри Basic File I /O

чтение файла, закрытие ();Поток ввода-вывода в блоке finally

3) вы создаете множество DoShowDialog (null, theMsg, 0)) ;, каждый цикл создает один и т. Д.

4) при каждом движении истинного и ложноговне этого потока ввода / вывода

5) загружать все события в некоторые массивы, если поток ввода / вывода

6) вы, вероятно, код заморозить GUI, если существует

7) переместить весь поток в задание BackGround

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