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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2010, 09:44   #1
jskorvin
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 16
Вопрос как открыть форму из потока

имеется:
форма с кнопкой запуска треда
Код:
unit main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, potok;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 tred.Create(false);
end;
 
end.
сам тред

Код:
unit potok;
 
interface
 
uses
  Classes, testform;
 
type
  tred = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
 
implementation
 
 
{ tred }
 
procedure tred.Execute;
begin
  testform.Form3.Show;
end;
 
end.
форма которую хочется показывать из треда, на ней мемо, едит, лейбл, кнопка

Код:
unit testform;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form3: TForm3;
 
implementation
 
{$R *.dfm}
 
end.
При запуске потока показывается форма testform но без эдита и кнопки, по закрытию первой формы
erorina.JPG

Вопрос в том как показать эту форму правильно? Если туже форму показать по клику кнопки с первой формы - она отобразится правильно.
Я так понимаю дело в наследовании свойств родителя, который в данном случае не визуальный, но что и как указать не знаю =(
jskorvin вне форума Ответить с цитированием
Старый 29.10.2010, 11:29   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Вопрос в том как показать эту форму правильно?
Для работы с VCL (формы, кнопки,...) из потоков надо использовать
synchronise

procedure tred.Execute;
begin
synchronise( testform.Form3.Show );
end;

Но! Sinchronise приостанавливает текущий поток и выполняет указанную в его параметрах процедуру в основном потоке. Полностью теряется смысл потока.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.10.2010, 11:35   #3
jskorvin
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Для работы с VCL (формы, кнопки,...) из потоков надо использовать
synchronise

procedure tred.Execute;
begin
synchronise( testform.Form3.Show );
end;

Вот блин.. это же элементарно! *укоряет себя

Цитата:
Сообщение от evg_m Посмотреть сообщение
Но! Sinchronise приостанавливает текущий поток и выполняет указанную в его параметрах процедуру в основном потоке. Полностью теряется смысл потока.
В данном случае именно это и нужно, поток ожидает ввода данных.

evg_m: огромное спасибо!
jskorvin вне форума Ответить с цитированием
Старый 29.10.2010, 12:00   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
В данном случае именно это и нужно, поток ожидает ввода данных
Код:
procedure tred.Execute;
begin
synchronise( testform.Form3.Show );
end;
в данном случае (что будет потом не знаю) в потоке у вас НИЧЕГО не делается, более того сразу после показа form3.show поток завершает работу (происходит выход из процедуры Execute). таким образом ваш поток ничего не ждет.

На мой взгляд логичнее сделать так:
В основном потоке ждем ввода данных (через Form3 как я понимаю) и после того как данные (по мнению пользователя) готовы передаем данные в поток и запускаем его (например с помощью кнопки на form3). Пока данных нет поток нам просто не нужен и нет проблем с синхронизацией т.к. в потоке нет никаких форм, а есть только данные..
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.10.2010 в 12:10.
evg_m вне форума Ответить с цитированием
Старый 29.10.2010, 12:05   #5
jskorvin
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
procedure tred.Execute;
begin
synchronise( testform.Form3.Show );
end;
в данном случае (что будет потом не знаю) в потоке у вас НИЧЕГО не делается, более того сразу после показа form3.show поток завершает работу (происходит выход из процедуры Execute).
Да, это приведено для примера, сама суть так сказать.
jskorvin вне форума Ответить с цитированием
Старый 12.08.2013, 13:49   #6
ColdCode
 
Регистрация: 12.08.2013
Сообщений: 5
По умолчанию

Цитата:
Подсказали что нужно синхронизировать показ формы
что то у меня этот фокус не прокатил ) выхода из потока нет

Код:
 synchronize(testform.Form3.Show);

Последний раз редактировалось ColdCode; 12.08.2013 в 13:59.
ColdCode вне форума Ответить с цитированием
Старый 12.08.2013, 21:14   #7
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

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

PS Из минусов - нет визуального редактора и реализованы не все контролы. Сейчас есть: TGroupBox, TMemo, TEdit, TButton, TLabel и TImage. Не считая самой формы, конечно.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 12.08.2013, 23:50   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А зачем форму-то синхронизировать?
Она же только в потоке существует.

Код:
var
 Form:TMyForm;
begin
 Form:=TMyForm.Create(self);
 try
 Form.ShowModal;
 finally
   FreeAndNil(Form);
 end;
end;
Все.
Человек_Борща вне форума Ответить с цитированием
Старый 13.08.2013, 10:25   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
что то у меня этот фокус не прокатил ) выхода из потока нет
Вернее сказать поток НЕ ОСТАНАВЛИВАЕТСЯ для ввода(получения) данных с формы. Я прав?
А чего вы хотели. form.Show это "покажи и иди дальше".
Цитата:
более того сразу после показа form3.show поток завершает работу (происходит выход из процедуры Execute). таким образом ваш поток ничего не ждет.
Вы это читали?
Цитата:
На мой взгляд логичнее сделать так:
В основном потоке ждем ввода данных (через Form3 как я понимаю) и после того как данные (по мнению пользователя) готовы передаем данные в поток и запускаем его (например с помощью кнопки на form3). Пока данных нет поток нам просто не нужен и нет проблем с синхронизацией т.к. в потоке нет никаких форм, а есть только данные..
Оттуда же.

Потоку для вычислений не нужна форма, ему нужны данные! И предоставить ему их это задача основной программы(потока).
программа — запись алгоритма на языке понятном транслятору

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрыть и открыть форму Swatch Microsoft Office Access 1 31.05.2010 23:04
Как открыть главную форму с нективным окном recod Win Api 2 22.04.2010 21:39
Одну и ту же форму использовать как MDI-child форму и как модальную форму? PrimaryPro Общие вопросы Delphi 2 10.03.2010 20:52
vb 2008 как открыть форму? fize Помощь студентам 0 17.12.2009 21:18
С++. Открыть вторую форму ЛУНА55 Помощь студентам 2 10.12.2009 11:35