![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск формы в другом потоке [D7, WinXP]
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]А почему нельзя создавать формы в разных потоках? или как можно?