Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск формы в другом потоке [D7, WinXP]


Страницы:   1 2

SamProf ©   (2006-02-27 11:27:00) 

Здравствуйте, Мастера! Вот такой вот вопрос:
Есть:
form1:TForm1
procedure TForm1.Button1Click(Sender: TObject);
var
  t:ttt;
begin
t:=ttt.Create(false);
end;
//================
Tform2
//===================
И поток:
ttt
procedure ttt.Execute;
var
  f:Tform;
begin
    f:=TForm2.Create(Application.MainForm);
    f.Show;
    while not Terminated do Application.ProcessMessages;
end;

Эта гадость выдаёт ошибку. Не понимаю в чём дело!
А цель этого всего - следующая:
Запустить из головной формы несколько форм и чтобы эти формы работали каждая в сыоём потоке и никак не трогали друг друга.

Спасибо!


Сергей М.   (2006-02-27 12:22:00) [1]


> У меня ушибку выдает именно CREATE!!!!! блин


Попробуй сделать тоже самое с заведомо "пустой" формой, имеющей Visible = False
Удивись - исключение при выполнении Create не возникает !
Оно возникнек сразу же как только ты установишь Visible = True либо вызовешь любой из ее Show-методов.


Сергей М.   (2006-02-27 12:19:00) [2]


> SamProf ©   (27.02.06 12:02) [15]



> То есть ну НИКАК?


Ну почему же никак ?

Ты же создал форму ... причем - успешно ... но при попытке ее визуализации получил отлуп, что вполне нормально и ожидаемо.

Пойми - создавать форму в доп.потоке бессмысленно !

В доп.потоке следует вызывать подпрограммы, которые потенциально могут выполняться длительное время. Такими подпрограммами могут быть, в том числе , методы той самой формы, что не дает тебе покоя и которую ты пытаешься создать там где ее не надо создавать.

Иллюстрация:

TMyThread = class(TThread)
private
 FForm: TSomeForm;
 FResult : TSomeResultType;
 procedure ShowResult;
protecteed
 procedure Execute; override;
public
 constructor Create(SomeForm: TSomeForm);  
end;

..

constructor TMyThread.Create(SomeForm: TSomeForm);
begin
 FForm := SomeForm;
 inherited Create(True);
 FreeOnTerminate := True;
 Resume;
end;

procedure TMyThread.Execute;
begin
 FResult := FForm.SomeFtpComponent.SomeMethod;
 Synchronize(ShowResult);
end;

procedure TMyThread.ShowResult;
begin
 FForm.SomeControl.SomeProperty := FResult;
end;

...

procedure TMyForm.SomeButtonClick(..);
var
 t: TMyThread;
begin
 t := TMyThread.Create(Self);
end;


SamProf   (2006-02-27 12:19:00) [3]

Извините за ещё очень глупый вопрос!
можно записать такой вот код:
form1:Tform1
f:Tform2;

f:=Tform2.create(nil);
f.parent:=form1.panel1;
Тогда форма будет в этой панели - ЭТО ВЕРНО!

А суть глупого вопроса в следующем! Можно ли запустить другую прогу, чтобы её форма была к меня в панели? глупо, прада? однако, чтобы удостоверится я спросил!


sniknik   (2006-02-27 12:19:00) [4]

> Хорошо, а если на одной из форм Image грузит 200 метровую картинку. Как я это в поток засуну, кроме как форма в
> отдельном потоке?
грузить в битмап в дополнительном потоке, после отработки присвоить его имеджу на форме в основном.

разделяй действие/данные и визуализацию.


SamProf   (2006-02-27 12:11:00) [5]


> Да потому что обработкой оконных сообщений занимается основной
> поток...

И тут до меня дошло!!!! СПАСИБО! однако обидно!


SamProf   (2006-02-27 12:09:00) [6]

Хорошо, а если на одной из форм Image грузит 200 метровую картинку. Как я это в поток засуну, кроме как форма в отдельном потоке?


Style   (2006-02-27 12:06:00) [7]


> В общем, как я понимаю, хотя да конца не понимаю плчему,
>  что в потоках нельзя создавать формы?
> А очень хочется! То есть ну НИКАК?


Да потому что обработкой оконных сообщений занимается основной поток...


SamProf   (2006-02-27 12:04:00) [8]


> Ну ты же сам сказал - "Эта гадость выдаёт ошибку" !"Гадость"
> в этом случае - конкретно метод Show(), как раз и визуализирующий
> форму

У меня ушибку выдает именно CREATE!!!!! блин


SamProf   (2006-02-27 12:02:00) [9]


> Что значит "висит" ?И для чего код ftp-клиента обязательно
> "вешать" именно на форму ?


Висит, это на ней находится IdFTP1 или ещё чего похожего! Я согласен, что можно эго создать и динамически, но ведь визуально то проще!

В общем, как я понимаю, хотя да конца не понимаю плчему, что в потоках нельзя создавать формы?
А очень хочется! То есть ну НИКАК?


Style   (2006-02-27 12:01:00) [10]


> Cкажем на одной форме висит ftp клиент,

Полагаю что ftp клиент уже будет использовать как минимум 2 потока.
один для общения с сервером, второй для самого трансфера файлов... Причем оба потока скорее всего созданы из основного, после вызова определенной функции например connect.


> на другой сидит  копирование файлов,
>на третей выкачка файлов из инета и т.д.


Эти опирации тоже можно выполнить в отдельном потоке.


Сергей М.   (2006-02-27 11:59:00) [11]


> Это как?


Ну ты же сам сказал - "Эта гадость выдаёт ошибку" !

"Гадость" в этом случае - конкретно метод Show(), как раз и визуализирующий форму.


Сергей М.   (2006-02-27 11:58:00) [12]


> на одной форме висит ftp клиент


Что значит "висит" ?
И для чего код ftp-клиента обязательно "вешать" именно на форму ?

procedure ttt.Execute;
begin
.. создать объект , реализующий логику FTP-клиента
.. поработать с этим объектом (та самая времяемкая операция)
.. известить, если нужно, ту или иную форму о результатах работы
.. уничтожить объект
end;


SamProf   (2006-02-27 11:55:00) [13]


> > Application.ProcessMessagesЭтот вызов не только не допустим,
>  но и бессмысленен в контексте любого кодового потока, отличного
> от основного.


Согласен, это чисто для теста!
То есть
> Создавать-то в общем случае можно.Но визуализировать нельзя.

Это как?


Сергей М.   (2006-02-27 11:53:00) [14]


> отличного от основного


Еще точнее - отличного от того, в котором был создан объект Application


SamProf   (2006-02-27 11:52:00) [15]


Ну и что ?Зачем для этого
> формы в отдельных кодовых потоках создавать ?


Скажем на одной форме висит ftp клиент, на другой сидит копирование файлов, на третей выкачка файлов из инета и т.д. И если позапускать эти формы просто, то я думаю во время того, как одна форма нагрузится, то другие фиг чё сделают! Может я не прав! объесни, пожайлеста чайнику!


Сергей М.   (2006-02-27 11:51:00) [16]


> Application.ProcessMessages


Этот вызов не только не допустим, но и бессмысленен в контексте любого кодового потока, отличного от основного.


Style   (2006-02-27 11:50:00) [17]


> почему нельзя создавать формы в разных потоках? или как
> можно?


Потому что форма должна быть в том потоке где инициализировано твое приложение TApplication...


> Скажем программа будет поддерживать некоторое колличество
> плагинов разного характера.


Вот эти "плагины" - действия и помещай в потоки...


Сергей М.   (2006-02-27 11:49:00) [18]


> почему нельзя создавать формы в разных потоках?


Создавать-то в общем случае можно.
Но визуализировать нельзя.
Отрисовкой окон, принаждежащих VCL-форме и VCL-контролов на ней, должен заниматься основной кодовый поток.


Сергей М.   (2006-02-27 11:47:00) [19]


> SamProf ©   (27.02.06 11:43) [3]


Ну и что ?

Зачем для этого формы в отдельных кодовых потоках создавать ?

Доп.кодовые потоки нужны для параллельного выполнения длительных (времяемких) вычислительных алгоритмов, не более того.


SamProf   (2006-02-27 11:46:00) [20]

А почему нельзя создавать формы в разных потоках? или как можно?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо