#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()
— правильный способ, если вы это имеете в виду. Хотя я не уверен, что понял остальную часть вашего вопроса.