Вверх ↑
Этот топик читают: Гость
Ответов: 127
Рейтинг: 0
#1: 2018-07-08 13:10:01 ЛС | профиль | цитата
Друзья, запускаю программу, через некоторое время ловлю зависание.
Используется thread (иначе программа сразу зависает: надо опрашивать сервер).
В справке написано что "Не рекомендуется изменять внешний вид интерфейсных элементов из схемы, стоящей после метода doExec". Я не могу понять, если я отправил запрос, получил данные и разложил по элементам Edit, это уже изменение интерфейса? Если да, то как быть? Мне надо запрос в потоке отправить и показать их юзеру.
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8887
Рейтинг: 823
#2: 2018-07-08 13:29:12 ЛС | профиль | цитата
faniss, "внешний вид" -- длина, ширина, отступы. А текст в Edit -- "содержание"
карма: 19

0
Ответов: 127
Рейтинг: 0
#3: 2018-07-08 13:35:59 ЛС | профиль | цитата
Леонид, спасибо. Значит, дело не в бобине.
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#4: 2018-07-08 13:59:58 ЛС | профиль | цитата
Леонид писал(а):
"внешний вид" -- длина, ширина, отступы. А текст в Edit -- "содержание"

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

Редактировалось 1 раз(а), последний 2018-07-08 14:01:04
карма: 22

0
Ответов: 127
Рейтинг: 0
#5: 2018-07-08 14:30:02 ЛС | профиль | цитата
Вот. Тогда пример по Thread из справки тоже по сути неправильный?
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#6: 2018-07-08 20:08:42 ЛС | профиль | цитата
faniss писал(а):
Тогда пример по Thread из справки тоже по сути неправильный?

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

Редактировалось 1 раз(а), последний 2018-07-08 20:09:01
карма: 22

0
Ответов: 4621
Рейтинг: 746
#7: 2018-07-09 12:18:36 ЛС | профиль | цитата
nesco писал(а):
Если вы меняете текст из параллельного потока в асинхронном режиме, то запишите его в буфер
Или проще, для доступа к визуальным компонентам из параллельных потоков используйте компонент Synchronize. При этом продолжительная по времени операция должна выполняться в параллельном потоке, а через Synchronize нужно выполнять только короткие операции (типа, вывести результат или считать данные для обработки в пар. потоке), так как длинная операция будет эквивалетной отсутствию параллельного потока.
Леонид писал(а):
"внешний вид" -- длина, ширина, отступы. А текст в Edit -- "содержание"
Как и сказал nesco, почти любой доступ к интерфейсному элементу ("почти" - потому что некоторые действия с элементом могут и не приводить к ошибкам, но всё же).
карма: 26

0
Ответов: 8887
Рейтинг: 823
#8: 2018-07-09 12:46:38 ЛС | профиль | цитата
Netspirit писал(а):
Как и сказал nesco
Я уже понял и раскаиваюсь!
карма: 19

0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)