Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
1

Thread и обновление формы

25.01.2016, 15:08. Показов 4853. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При работе с потоком, что бы обновить данные вызывается метод Synchronize(процедура); При пошаговом дебаге потока, все данные присваиваются компонентам программы, но графически не отображается, т.е. в режиме отладке label.caption:='123456'; а на форме label.caption=''. Никаких ошибок при работе потока не возникает. После отработки и обновления данных поток завершается. В чём может быть причина?
при попытке вставить в начало исполнения потока form1.caption:='...'; тоже ничего не происходит, form1.caption значение меняется внутри, но визуально никак не отображается...
Поток идёт отдельным юнитом и подключён к основной форме.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2016, 15:08
Ответы с готовыми решениями:

Как приостановить потоки (Thread-ы) при перемещении формы?
Привет всем. Программа использует 4-и потока которые принимают данные , обрабатывает данные и...

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

Thread.Sleep только для одной формы
Здравствуйте столкнулся с такой штукой, есть form1 на ней кнопка, в которой создается и открывается...

Обновление подчинненой формы из другой формы!
Здравствуйте! Я начинающий разрабочик баз данных. При разработке моего проекта у меня возникла...

26
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
25.01.2016, 15:17 2
Цитата Сообщение от firstoxe Посмотреть сообщение
т.е. в режиме отладке label.caption:='123456'; а на форме label.caption=''
Потому что форма не перерисовывается при изменении свойства label.caption. Делайте Application.ProcessMessages после присвоения, тогда будет обновляться.
0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 15:28  [ТС] 3
Спасибо. но application.ProcessMessages; и refresh не спасают ситуацию... Пока тестил сейчас, нашёл косяк. На форму помещаю кнопку в ней указываю label1.caption:='1' , и как ни странно лабел обновляется. Но!! Если обращаюсь form1.label1.caption:='1', то всё остаётся без изменений! Почему? тогда логично что и потоков у меня ничего не отображается, так как там тоже идёт обращение к компонентам через form1
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
25.01.2016, 15:31 4
Цитата Сообщение от firstoxe Посмотреть сообщение
Спасибо. но application.ProcessMessages; и refresh не спасают ситуацию.
Есть еще один момент. Во время отладки многопоточного приложения все потоки, кроме отлаживаемого, приостанавливаются на все время отладки.

Цитата Сообщение от firstoxe Посмотреть сообщение
Если обращаюсь form1.label1.caption:='1', то всё остаётся без изменений
Может быть это разные объекты?
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
25.01.2016, 15:38 5
Цитата Сообщение от quwy Посмотреть сообщение
Делайте Application.ProcessMessages
пропущено НЕ
НЕ делайте ProcessMessages!

при пошаговой отладке вообще не обязаны перерисовываться компоненты
ну на худой конец напишите Label1.Update;
0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 15:40  [ТС] 6
Есть еще один момент. Во время отладки многопоточного приложения все потоки, кроме отлаживаемого, приостанавливаются на все время отладки.
тестируется только один поток и его одноразовое выполнение.

Может быть это разные объекты?
В проекте только один unit1 в котором находится form1, в котором label1, промахнутся не возможно. unit1.form1.label1.caption:='1', аналогично ничего не происходит.

при пошаговой отладке вообще не обязаны перерисовываться компоненты
Как правило они должны перерисоваться после завершения потока, Но этого не происходит
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.01.2016, 15:43 7
Цитата Сообщение от firstoxe Посмотреть сообщение
и потоков ... идёт обращение к компонентам через form1
А завтра у тебя будет не одна и не десять, а сотня форм..

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

Что, так и будешь менять в коде потока "Form1" на "Form2", потом "Form2" на "Form3" и всякий раз перекомпилировать проект ?

Кривой, изначально ущербный и тупиковый это путь.

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

Его задача, как и у обычной функции, - получить данные-параметры (неважно какие и от кого), произвести некие вычисления над этими данными и вернуть результаты вычислений (неважно кому - в целом это не его забота знать кто в этих результатах заинтересован)
0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 15:43  [ТС] 8
Цитата Сообщение от krapotkin Посмотреть сообщение
ну на худой конец напишите Label1.Update;
Label1.Update; не принёс результата. Такое ощущение, что label1 и form1.label1 абсолютно два разных компонента...
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
25.01.2016, 15:44 9
Цитата Сообщение от krapotkin Посмотреть сообщение
пропущено НЕ
НЕ делайте ProcessMessages!
Почему нет, если нужно обновить форму? Мало ли что там еще за время работы наложилось поверх. Если перерисовывать, то все сразу, чтобы не было такого, как в некоторых программах: затертая всяким мусором форма, и бодро обновляющийся на ней одинокий Label или PrograssBar...
0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 15:52  [ТС] 10
Цитата Сообщение от mss Посмотреть сообщение
А завтра у тебя будет не одна и не десять, сотня форм..
А послезавтра ты захочешь чтобы твой поток обновлял caption лебйла, находящегося на другой форме ..
А послепослезавтра - на третьей ..
Что, так и будешь менять в коде потока "Form1" на "Form2", потом "Form2" на "Form3" и всякий раз перекомпилировать проект ?
Кривой, изначально ущербный и тупиковый это путь.
Поток не должен знать ничего ни о каких формах, ему должно быть глубоко фиолетово есть в проекте какие-то там формы или нет их там вообще.
Его задача, как и у обычной функции, - получить данные-параметры (неважно какие и от кого), произвести некие вычисления над этими данными и вернуть результаты вычислений (неважно кому - в целом это не его забота знать кто в этих результатах заинтересован)
И? поток выполняет свою роль, пока программа работает дальше, но надо видеть полученную и отработанную информацию в потоке на форме, для этого есть метод synchronize. Поток добавил специально для того, что бы вся программа не висела из за кода, который там выполняется

Добавлено через 4 минуты
Ну и да, поток потоком, но внутри формы, form1.label1 и label1 как два разных компонента. Почему? при обращение к label1 внутри формы всё ок, а при обращении form1.label не ок?
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.01.2016, 15:54 11
Цитата Сообщение от firstoxe Посмотреть сообщение
form1.label1 и label1 как два разных компонента. Почему?
Где находится строчка
Delphi
1
form1 : TForm1;
?
0
mss
25.01.2016, 15:55
  #12

Не по теме:

Цитата Сообщение от firstoxe Посмотреть сообщение
для этого есть метод synchronize
Я ж не имею ничего против использования самого метода, принципов и контекста его использования)

Я возражаю против жесткой зависимости одной проектной сущности от другой, при которой любое несущественное изменение в проекте ведет к вынужденному изменению структуры программных сущностей, и, как следствие, к перекомпиляции и пересборке проекта, а то и не одного)

Как говаривал Федя Шурику - "смотреть надо ширше" (С)

0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 15:56  [ТС] 13
Цитата Сообщение от northener Посмотреть сообщение
Где находится строчка
DelphiВыделить код
1
form1 : TForm1;
?
var
Form1: TForm1;
implementation
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.01.2016, 15:57 14
В каком юните эти строчки?
0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 15:58  [ТС] 15
Цитата Сообщение от northener Посмотреть сообщение
В каком юните эти строчки?
unit1
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.01.2016, 16:00 16
Тогда как эта форма создается?
0
mss
25.01.2016, 16:00
  #17

Не по теме:

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

0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 16:10  [ТС] 18
Цитата Сообщение от mss Посмотреть сообщение
Не по теме:
firstoxe, почему-то никто не удивляется что любой компонент из палитры, будучи шлепнутый на любую форму, ведет себя одинаково на любой форме, не зная заранее при этом куда его шлепнули, однако как толко речь заходит о потоке - тут же начинается ступор и последующая свистопляска с присобачиванием к коду потока инф-ции о конкретной форме, которая ему так же как тому компоненту нафих не нужна в принципе)
Это я понял, но если опустить поток? Почему в одной голой форме label1.caption работает, а form1.label1.caption не работает?


Добавлено через 7 минут
Цитата Сообщение от northener Посмотреть сообщение
Тогда как эта форма создается?
В плане? создал проект с формой, накидал пару компонентов, создал поток для запроса и работы с xml, всё прекрасно кроме ошибок дескриптора окна из-за прямого обращения к форме из потока без использования функции synchronize. Переписал под synchronize, поработало и перестало..., от и до пробежался по коду, всё нормально, ошибок нет, продебажил... всё хорошо, а вот почему label1 и form1.label1 как будто 2 разных компонента, я понять не могу... Форма 1 лабел один... И да, ща продебажил таким образом, label1.caption:='1'; form1.label1.caption:='2';
без потока. Как ни странно, label1 присвоился 1, а form1.label1 присвоилось 2.... А на форме label1 = 1. И как это понимать...
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.01.2016, 16:16 19
Цитата Сообщение от firstoxe Посмотреть сообщение
И как это понимать...
Приложи к сообщению архив с проектом.
0
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
25.01.2016, 16:19  [ТС] 20
Вот ещё как.
Delphi
1
2
3
4
label1.caption:='1';
form1.label1.caption:='2';
memo1.lines.add('label1 - ' + label1.caption);  //-- 1
memo1.lines.add('form1.label1 - ' + form1.label1.caption);  //-- 2
ну вот как так?
0
25.01.2016, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2016, 16:19
Помогаю со студенческими работами здесь

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая...

Неоднозначный вызов следующих методов или свойств - Thread.Thread()
Вот кусок кода, по которому у меня вопрос: ...

Передать данные в работающий thread из другого thread
Есть 2 потока запущенные разными классами и из потока А нужно сообщить потоку Б что бы он запустил...

Обновление основной формы данными из внедрённой формы, основанной на основной форме
Всем привет! Извиняюсь за тавтологию, но зато изложено кратко! В приложении БД. Не обращайте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru