Печать промежуточных шагов в java зависает

Я пишу Java-приложение, которое шифрует и расшифровывает ввод по алгоритму DES. Сначала я сделал это без графического интерфейса и напечатал промежуточные шаги в окне вывода, используя System.out.print();. Когда ввод большой, вычисления могут занять некоторое время, но при использовании окна вывода промежуточные шаги печатались один за другим во время вычисления. Это было прекрасно.

Теперь я сделал графический интерфейс для своей программы, используя JTextArea, называемый txtDebug для печати промежуточных шагов:

public static void debug(String tekst){
txtDebug.setText(txtDebug.getText()+tekst+"\n");}

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

Еще одна проблема: когда я не использовал графический интерфейс, программа никогда не падала, теперь, если ввод достаточно большой, программа падает: она зависает и просто больше не возвращается к жизни.

Любая помощь, пожалуйста?


person user1026090    schedule 02.11.2011    source источник


Ответы (2)


Вы должны выполнять работу в фоновом рабочем потоке. Выполнение этого в основном потоке не позволит Swing обрабатывать события -> пользовательский интерфейс будет заблокирован.

person Aaron Digulla    schedule 02.11.2011
comment
Спасибо за ответ, я читал о SwingWorker, но я не уверен, как его реализовать, это структура моей программы: у меня есть Functions.java, который содержит все функции, используемые для шифрования и дешифрования, 2 классы Encryption.java и Decryption.java, они вызывают правильные функции из Functions.java, и у меня есть класс Main.java, который содержит графический интерфейс и обработчики действий и вызывает Encrypt.java или Decrypt.java. Я также добавил функцию в Main.java, чтобы Encrypt.java и Decrypt.java могли записывать отладочную информацию в txtDebug. Какой из этих классов должен расширять SwingWorker? - person user1026090; 02.11.2011
comment
Никто; SwingWorker — это служебный класс. См. пример в JavaDocs (вторая ссылка в моем ответе). См. download.oracle.com/javase/tutorial/uiswing/concurrency/< /а> - person Aaron Digulla; 03.11.2011
comment
Спасибо, теперь я использую SwingWorker в своем классе Encrypt для вычислений в фоновом режиме, а когда расчет завершен, я печатаю промежуточные шаги в своем графическом интерфейсе. Теперь другая проблема: без графического интерфейса моя программа вычисляет очень быстро, около 100 итераций в секунду. С GUI и SwingWorker моя программа вычисляет только 1 итерацию в секунду. Как это случилось? - person user1026090; 03.11.2011
comment
Пользовательский интерфейс занимает много циклов. Обновляйте только 3-4 раза в секунду (используйте System.currentTimeMillis(), чтобы определить, когда вы в последний раз обновляли пользовательский интерфейс). - person Aaron Digulla; 07.11.2011

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

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

person Adamski    schedule 02.11.2011
comment
Спасибо за ответ, я читал о SwingWorker, но я не уверен, как его реализовать, это структура моей программы: у меня есть Functions.java, который содержит все функции, используемые для шифрования и дешифрования, 2 классы Encryption.java и Decryption.java, они вызывают правильные функции из Functions.java, и у меня есть класс Main.java, который содержит графический интерфейс и обработчики действий и вызывает Encrypt.java или Decrypt.java. Я также добавил функцию в Main.java, чтобы Encrypt.java и Decrypt.java могли записывать отладочную информацию в txtDebug. Какой из этих классов должен расширять SwingWorker? - person user1026090; 02.11.2011