Могу ли я использовать событие OnChange окна редактирования для обработки потоков? - PullRequest
0 голосов
/ 20 апреля 2011

Это правильный способ получить ответы из потока через OnChange событие Editbox, вызвав метод synchronize, который меняет значение 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;

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

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

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

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

2 голосов
/ 20 апреля 2011

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

0 голосов
/ 20 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...