Необходимо очистить Java EDT (очередь отправки событий) - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть приложение на Java, где многие потоки быстро пишут в StyledTextBox.В какой-то момент все потоки прекращаются.Тем не менее, TextBox продолжает получать текст, предположительно, потому что очередь отправки была немного резервной копии.Можно ли каким-то образом принудительно сбросить EDT, чтобы при завершении потоков обновления в TextBox немедленно заканчивались?

Спасибо, Джим

Ответы [ 3 ]

5 голосов
/ 08 февраля 2012

Вы можете push() свой собственный EventQueue подкласс, как показано здесь , и добавить свой собственный метод flush(), чтобы очистить очередь. Обратите внимание, что getNextEvent() блокируется, если очередь пуста, поэтому сначала проверьте peekEvent().

2 голосов
/ 08 февраля 2012

Используйте очередь для применения измененного текста, запланируйте события и EDT, которые обрабатывают очередь до ее возвращения.Это приведет к «пустым» событиям, когда потоки закончатся и будет запущено еще одно запланированное событие в EDT.

1 голос
/ 09 февраля 2012

Хорошо, я нашел решение.Идея состоит в том, чтобы установить прослушиватель «verify», который вызывается всякий раз, когда текст собирается добавить в StyledText.Поэтому, когда текст будет добавлен (из резервной очереди отправки), код ищет установленный флаг, указывающий, были ли завершены потоки.Если потоки были прерваны, игнорируйте обновление текста.Это позволяет элементу управления перестать обновляться, одновременно позволяя опустошить очередь событий.Следующий фрагмент кода решает проблему.

txtOutput - это элемент управления StyledText.
endingThreads - это boolean, установленный в true после завершения потоков.
Похоже, это самый простой способ решить проблему в приложении SWT.

        txtOutput.addVerifyListener(new VerifyListener() {
        public void verifyText(VerifyEvent e)
        {
            if( !endingThreads )
            {
                e.doit = true;
            }
            else
            {
                e.doit = false;
            }
        }
    });
...