Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2024, 09:47   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Обновление информации в компоненте в потоке

Добрый день!

Такой вопрос.
Есть главная форма - Form1.
Из нее вызывается дополнительная форма Form2, на которой мне надо в Label1.Caption выводить некую информацию, которую обрабатывает поток - некий мой MyThread. Например, в процессе работы потока в Label1.Caption выводить имя обрабатываемого в потоке MyThread файла.
Проблема в том, если я прописываю в потоке это, то поток не срабатывает.

Как можно в потоке на Form2 выводить информацию в Label1.Caption?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.04.2024, 10:10   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

https://delphi-manual.ru/synchronize.php
p51x вне форума Ответить с цитированием
Старый 03.04.2024, 10:55   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Да, конечно я видел эту ссылку и использовал из нее материалы.
У меня сейчас сделано так.
В глобальных переменных основной Form1 объявлена переменная
Код:
...
var
  ZippingVar: string;
...
Из Form1 я вызываю форму Form2 через нажатие на кнопку (Form2 убрал из списка автосоздаваемых через Project-Options):
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TForm;
begin
  F:=TForm2.Create(Application);
  F.Show;
end;
Затем, в событии Form2.OnActivate срабатывает запуск моего потока:
Код:
procedure TForm2.FormActivate(Sender: TObject);
begin
  CompressingThread.Create(False);
end;
Сама структура класса потока (который расположен в Form2) такая:
Код:
type
  CompressingThread = class(TThread)
private
  procedure UpdateInfo;
protected
  procedure Execute; override;
end;
Затем сама процедура UpdateInfo:
Код:
procedure CompressingThread.UpdateInfo
begin
  Form2.Label1.Caption:=ZippingVar; //моя глобальная переменная, которая объявлена в Form1
end;
Структура самого потока CompressingThread такова:
Код:
procedure ComporessingThread.Execute;
begin
  while True do
  begin
    ...//основной код потока
    ZippingVar:=ListBox1.Strings[i]; //где-то в цикле присваивается имя файла, которое надо отобразить в Form2.Label1.Caption
    ...
   Synchronize(UpdateInfo);
   Sleep(100);
  end;
end;
Вот, все. Однако, в Form2.Label1.Caption так и не отображается имя файла из потока...
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.04.2024, 11:59   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
(Form2 убрал из списка автосоздаваемых через Project-Options):
Цитата:
Код:
Form2.Label1.Caption:=ZippingVar;
в этом случае НАДО "заполнить" переменную Form2.
( и сделать это ДО запуска потока)
1 вар.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TForm;
begin
  Form2:=TForm2.Create(Application);
  Form2.Show;
end;
2 вар.
Код:
procedure TForm2.FormActivate(Sender: TObject);
begin
  form2:=self;
  CompressingThread.Create(False);
end;
3 вар. ( без var form2)
при запуске потока указать ему какой control (label) ему заполнять.
Код:
CompressingThread.Create(False, SELF.label1);
соответственно в потоке выделить поле для хранения этого объекта
Код:
private
myinfo: TLabel;// контрол ДЛЯ заполнения
zipinfo: string; // информация ДЛЯ вывода
и заполнять оное все также соблюдая требования синхронизации
Код:
synchronize(UpdateInfo);
Код:
procedure CompressingThread.UpdateInfo
begin
  Form2.Label1.Caption:=ZippingVar; //моя глобальная переменная, которая объявлена в Form1
  myinfo.Caption:=zipinfo;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.04.2024 в 12:04.
evg_m вне форума Ответить с цитированием
Старый 03.04.2024, 12:21   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
в этом случае НАДО "заполнить" переменную Form2.
( и сделать это ДО запуска потока)
1 вар.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F: TForm;
begin
Form2:=TForm2.Create(Application);
Form2.Show;
end;
Решил попробовать вариант №1.
Да, в событий активации Form2 написал так:
Код:
procedure TForm2.FormActivate(Sender: TObject);
begin
  Form2.Label1.Caption:=ZippingVar;
  CompressingThread.Create(False);
end;
В Synchronize(UpdateInfo) написал так:
Код:
procedure CompressingThread.UpdateInfo;
begin
  Form2.Label1.Caption:=ZippingInfo;
end;
Вроде поток отрабатывает, но в Form2.Label1.Caption почему-то выводится имя последнего файла только. Получается, что при каждом обращении к файлу, почему-то не заносится имя, может отрабатывает так быстро, а может синхронизация не проходит как-то и я ее не том месте расположил.

Кстати, может быть Synchronize(UpdateInfo) надо расположить в цикле for...end, в котором идет цикл по именам файла?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.04.2024, 13:42   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Кстати, может быть Synchronize(UpdateInfo) надо расположить в цикле for...end, в котором идет цикл по именам файла?
Если вы в цикле пишете имена файлов в одну переменную, а после цикла записываете в контрол, то что можно ожидать в этой переменной, кроме значения на последней итерации?
p51x вне форума Ответить с цитированием
Старый 03.04.2024, 19:05   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Если вы в цикле пишете имена файлов в одну переменную, а после цикла записываете в контрол, то что можно ожидать в этой переменной, кроме значения на последней итерации?
Да, я уже нашел ошибку и исправил ее.
Последний вопрос: как отследить, что поток закончил свою работу? Мне чтобы закрыть приложение по окончанию работы потока.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 04.04.2024, 09:22   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

OnTerminate

https://programmersforum.ru/showpost...10&postcount=4
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.04.2024 в 09:36.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамичное обновление информации в терминале Linux cipher3 Свободное общение 1 14.05.2022 18:07
Обновление информации [бд mysql] webber9989 PHP 2 17.07.2010 11:36
Обновление и вывод информации из файла в Delphi Николай ПН Помощь студентам 1 26.04.2010 23:04
(PHP) Передача информации о выбранном компоненте sabina_smile PHP 2 11.12.2007 23:22