@Fenix957

Как создать компонент в потоке и оставить его в delphi?

В общем нужно было создать компонент в потоке но не уничтожать этот компонент по завршении потока . кто нибудь может подсказать вот как сейчас создается компонент

TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
var
  Form6: TForm6;
   MyThread: TMyThread;
    Memo: TMemo;
implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
 Memo:=TMemo.Create(Form6);
  Memo.Parent:=Form6;
  Memo.Left:=50;
  Memo.Top:=50;
  Memo.Width:=250;
  Memo.Height:=100;
  Memo.Text:='Мама я родился!';
  ///MyThread.Suspend; приоставление потока но тогда работать с компонетом работать не возможно а если не ставить это то компонент уничтожается по завершении потока 
end;

procedure TForm6.btn1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(False);
//Параметр False запускает поток сразу после создания, True - запуск впоследствии , методом Resume
//Далее можно указать параметры потока, например приоритет:
  MyThread.Priority:=tpNormal;
end;
  • Вопрос задан
  • 727 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Можно, только синхронно. Используй TThread.Synchronize. Код пишется с листа, не уверен, что действующий.
procedure TMyThread.SyncCreateMemo;
begin
 Memo:=TMemo.Create(Form6);
  Memo.Parent:=Form6;
  Memo.Left:=50;
  Memo.Top:=50;
  Memo.Width:=250;
  Memo.Height:=100;
  Memo.Text:='Мама я родился!';
end;

procedure TMyThread.Execute;
begin
  Synchronize(SyncCreateMemo);
end;


Второй способ, более сложный и опасный — PostMessage. Здесь никаких задержек поток испытывать не будет. Но будьте осторожны — форма создаст компонент когда угодно и нельзя его заполнять сразу же.
procedure TForm6.WmCreateMemo; // message WM_CREATEMEMO = WM_USER + 1
begin
 Memo:=TMemo.Create(Form6);
  Memo.Parent:=Self;
  Memo.Left:=50;
  Memo.Top:=50;
  Memo.Width:=250;
  Memo.Height:=100;
  Memo.Text:='Мама я родился!';
end;

procedure TMyThread.Execute;
begin
  PostMessage(Form6.Handle, WM_CREATEMEMO, 0, 0);
end;


Заполнять наш редактор тоже можно путём PostMessage, но тут тоже будьте осторожны: сообщения-то выполнятся по порядку, но никто не знает, до окончания потока или нет. Бывает и такое, что два сообщения ушли в очередь, но ещё не обработались. В общем, будьте предельно осторожны с временем жизни объекта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@RZaripov
Delphi программист
нельзя в доп потоке создавать визуальные компоненты
Ответ написан
Комментировать
@DeathGun
Все можно, через конструктор потока передаем указатель на компонент в формате twincontrol. Пользуемся функцией synchronize и не каких глюков!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы