Могу ли я использовать событие onChange окна редактирования для обработки потоков?

#multithreading #delphi #events #synchronize

#многопоточность #delphi #Мероприятия #синхронизировать

Вопрос:

Правильный ли это способ получать ответы от потока через OnChange событие a Editbox , вызывая synchronize mothod, который изменяет значение Editbox ?

Что-то вроде этого :

 //Extra Thread
procedure HThread.Execute;
begin
    Synchronize(CallGUI);
end;

procedure HThread.CallGUI;
begin
  Edit.Text = 'Hello';
end;


//Main Thread
procedure Main;
begin
  Tr := HThread.Create(true);
  Tr.Edit := Form1.Edit1;
  Tr.Resume;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ShowMessage('Response from extra thread :'   Edit1.text);
end;
  

Комментарии:

1. Можете ли вы отредактировать вопрос, чтобы добавить описание событий в стиле временной шкалы? Мне непонятно, что вы хотели бы сделать, потому что TEdit.OnChange срабатывает в ответ на изменения в окне редактирования, и это в основном потоке. Метод synchronize — это то, что вы используете в фоновом потоке, чтобы что-то происходило в основном потоке VCL, а не то, что вы вызываете из onChange.

2. Заголовок вашего вопроса не соответствует телу вопроса (обработчик события onChange не «обрабатывает» ничего, связанного с потоком). Опубликованный вами код не компилируется, поэтому мы не можем точно угадать, что вы делаете. Игнорируя ошибки компилятора, не могу не спросить, почему вы не вызываете ShowMessage напрямую из CallGUI . Возможно, вам следует объяснить, что вы пытаетесь сделать, как в «конечной цели».

3. Хорошо, вы исправили бит, не связанный с компиляцией.

4. Я думаю, вопрос ясен. прочитайте ответ Матиаса Пеласе.

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

Ответ №1:

Ваше использование TEdit вызывает проблемы по нескольким причинам:

  • Похоже, что вы используете TEdit как место для передачи данных из потока (зависимость от OnChange обработчика событий заставляет меня думать, что требуется дополнительная обработка, TEdit не используется как простая «область вывода»). Элементы GUI никогда не следует использовать для хранения данных по бесчисленным причинам, начиная от производительности и заканчивая инкапсуляцией ООП и полагаясь на алгоритмы, находящиеся вне вашего контроля.
  • Полагаться на то, что OnChange обработчик событий срабатывает при программном изменении текста, — значит полагаться на детали реализации TEdit . Что, если Microsoft решит не запускать OnChange событие, если изменение было внесено программно? Или Embarcadero решает условно не показывать это, поскольку программисту не нужно уведомлять, он просто изменил это значение?

В остальном, ваше использование Syncronize() , вероятно, сработает, т. Е. «вы можете использовать это», но я бы сказал, что это не очень хорошая идея. Я хотел бы предложить лучшее решение, но не могу этого сделать, потому что я не знаю точно, что вы пытаетесь сделать. Если все, что вы хотите сделать, это принудительно OnChange запустить, тогда сохраните свой код.

Ответ №2:

Предполагая, что вы измените текстовое значение окна редактирования в процедуре, вызываемой через Synchronize() из потока, назначенное OnChange событие будет выполнено в потоке GUI. Это будет работать без проблем, но остановит ваш поток после обработки события.

Ответ №3:

Изменение чего-либо в пользовательском интерфейсе через Synchronize() — правильный способ, если вы это имеете в виду. Хотя я не уверен, что понял остальную часть вашего вопроса.