0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
|
|
1 | |
Thread и обновление формы25.01.2016, 15:08. Показов 4853. Ответов 26
Метки нет (Все метки)
При работе с потоком, что бы обновить данные вызывается метод Synchronize(процедура); При пошаговом дебаге потока, все данные присваиваются компонентам программы, но графически не отображается, т.е. в режиме отладке label.caption:='123456'; а на форме label.caption=''. Никаких ошибок при работе потока не возникает. После отработки и обновления данных поток завершается. В чём может быть причина?
при попытке вставить в начало исполнения потока form1.caption:='...'; тоже ничего не происходит, form1.caption значение меняется внутри, но визуально никак не отображается... Поток идёт отдельным юнитом и подключён к основной форме.
0
|
25.01.2016, 15:08 | |
Ответы с готовыми решениями:
26
Как приостановить потоки (Thread-ы) при перемещении формы? Обновление контрола формы из отдельного потока не класса формы Thread.Sleep только для одной формы Обновление подчинненой формы из другой формы! |
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
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
|
|
25.01.2016, 15:31 | 4 |
Есть еще один момент. Во время отладки многопоточного приложения все потоки, кроме отлаживаемого, приостанавливаются на все время отладки.
Может быть это разные объекты?
0
|
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
|
|
25.01.2016, 15:40 [ТС] | 6 |
0
|
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
25.01.2016, 15:43 | 7 |
А завтра у тебя будет не одна и не десять, а сотня форм..
А послезавтра ты захочешь чтобы твой поток обновлял caption лебйла, находящегося на другой форме .. А послепослезавтра - на третьей .. Что, так и будешь менять в коде потока "Form1" на "Form2", потом "Form2" на "Form3" и всякий раз перекомпилировать проект ? Кривой, изначально ущербный и тупиковый это путь. Поток не должен знать ничего ни о каких формах, ему должно быть глубоко фиолетово есть в проекте какие-то там формы или нет их там вообще. Его задача, как и у обычной функции, - получить данные-параметры (неважно какие и от кого), произвести некие вычисления над этими данными и вернуть результаты вычислений (неважно кому - в целом это не его забота знать кто в этих результатах заинтересован)
0
|
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
|
|
25.01.2016, 15:43 [ТС] | 8 |
Label1.Update; не принёс результата. Такое ощущение, что label1 и form1.label1 абсолютно два разных компонента...
0
|
Native x86
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
|
|
25.01.2016, 15:44 | 9 |
Почему нет, если нужно обновить форму? Мало ли что там еще за время работы наложилось поверх. Если перерисовывать, то все сразу, чтобы не было такого, как в некоторых программах: затертая всяким мусором форма, и бодро обновляющийся на ней одинокий Label или PrograssBar...
0
|
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
|
|
25.01.2016, 15:52 [ТС] | 10 |
И? поток выполняет свою роль, пока программа работает дальше, но надо видеть полученную и отработанную информацию в потоке на форме, для этого есть метод synchronize. Поток добавил специально для того, что бы вся программа не висела из за кода, который там выполняется
Добавлено через 4 минуты Ну и да, поток потоком, но внутри формы, form1.label1 и label1 как два разных компонента. Почему? при обращение к label1 внутри формы всё ок, а при обращении form1.label не ок?
0
|
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
|
|
25.01.2016, 15:54 | 11 |
0
|
mss
|
25.01.2016, 15:55
#12
|
Не по теме: Я ж не имею ничего против использования самого метода, принципов и контекста его использования) Я возражаю против жесткой зависимости одной проектной сущности от другой, при которой любое несущественное изменение в проекте ведет к вынужденному изменению структуры программных сущностей, и, как следствие, к перекомпиляции и пересборке проекта, а то и не одного) Как говаривал Федя Шурику - "смотреть надо ширше" (С)
0
|
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
|
|
25.01.2016, 15:56 [ТС] | 13 |
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 |
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 |
Это я понял, но если опустить поток? Почему в одной голой форме label1.caption работает, а form1.label1.caption не работает?
Добавлено через 7 минут В плане? создал проект с формой, накидал пару компонентов, создал поток для запроса и работы с 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 |
0
|
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 36
|
||||||
25.01.2016, 16:19 [ТС] | 20 | |||||
Вот ещё как.
0
|
25.01.2016, 16:19 | |
25.01.2016, 16:19 | |
Помогаю со студенческими работами здесь
20
Непонятки в Java. Chain method call. Thread.start() vs Thread.run() Неоднозначный вызов следующих методов или свойств - Thread.Thread() Передать данные в работающий thread из другого thread Обновление основной формы данными из внедрённой формы, основанной на основной форме Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |