BlackBerry - Тема не отвечает - PullRequest
1 голос
/ 17 мая 2011

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

У меня есть нить, которую я вызываю с помощью new Thread (). Start,затем он будет работать в течение короткого времени, и я получаю следующее сообщение:

Неполученное исключение: приложение "имя моего приложения (201)" не отвечает;процесс завершен

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

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

Есть предложения?

Чтобы расширить свой пост, проблема была в том, что я вызвал этот код ALOT из другой моей ветки:-

 invokeLater(new Runnable() 
        {
            public void run() 
            {
                _output.setText(_output.getText() + "\n" + msg);
            }
        });

Это создавало очередь, которая быстро разбивала мое приложение.

Мое решение было использовать поток событий, добавив этот код в мою функцию: -

   synchronized(Application.getEventLock()) {
       _output.setText("new text " + System.currentTimeMillis());
   }

Ответы [ 3 ]

1 голос
/ 17 мая 2011

Ты совершенно прав:

Я подумал, что, возможно, проблема заключается в том, что я использую функцию "InvokeLater" для обновления моего графического интерфейса с прогрессом потоков, я спамую это довольно сложно и боюсь, что это разрушит мой поток.

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

Решение, которое я использовал, чтобы обойти это в прошлом, состоит в том, чтобы разделить работу на части в потоке пользовательского интерфейса. Создайте объект-аккумулятор, логический флаг и блокировку. Затем рабочий поток захватывает блокировку и добавляет работу к аккумулятору. Логический флаг указывает, планируется ли рабочий код пользовательского интерфейса освободить аккумулятор в будущем. Если нет, запланируйте свой код обновления пользовательского интерфейса.

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

1 голос
/ 17 мая 2011

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

0 голосов
/ 17 мая 2011

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

...