Форум: "Основная";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
ВнизЗапуск формы в другом потоке Найти похожие ветки
← →
SamProf © (2006-02-27 11:27) [0]Здравствуйте, Мастера! Вот такой вот вопрос:
Есть:
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;
Эта гадость выдаёт ошибку. Не понимаю в чём дело!
А цель этого всего - следующая:
Запустить из головной формы несколько форм и чтобы эти формы работали каждая в сыоём потоке и никак не трогали друг друга.
Спасибо!
← →
MBo © (2006-02-27 11:33) [1]> чтобы эти формы работали каждая в сыоём потоке и никак не трогали друг друга
А для чего это нужно? Стоит пояснить.
← →
Сергей М. © (2006-02-27 11:42) [2]
> Запустить из головной формы несколько форм и чтобы эти формы
> работали каждая в сыоём потоке и никак не трогали друг друга
Они, формы, и так "не трогают друг друга".
Совершенно ни к чему запускать каждую из них в отдельном кодовом потоке, да и нельзя это делать, когда форма создана под управлением VCL.
← →
SamProf © (2006-02-27 11:43) [3]Скажем программа будет поддерживать некоторое колличество плагинов разного характера.
← →
SamProf © (2006-02-27 11:46) [4]А почему нельзя создавать формы в разных потоках? или как можно?
← →
Сергей М. © (2006-02-27 11:47) [5]
> SamProf © (27.02.06 11:43) [3]
Ну и что ?
Зачем для этого формы в отдельных кодовых потоках создавать ?
Доп.кодовые потоки нужны для параллельного выполнения длительных (времяемких) вычислительных алгоритмов, не более того.
← →
Сергей М. © (2006-02-27 11:49) [6]
> почему нельзя создавать формы в разных потоках?
Создавать-то в общем случае можно.
Но визуализировать нельзя.
Отрисовкой окон, принаждежащих VCL-форме и VCL-контролов на ней, должен заниматься основной кодовый поток.
← →
Style © (2006-02-27 11:50) [7]
> почему нельзя создавать формы в разных потоках? или как
> можно?
Потому что форма должна быть в том потоке где инициализировано твое приложение TApplication...
> Скажем программа будет поддерживать некоторое колличество
> плагинов разного характера.
Вот эти "плагины" - действия и помещай в потоки...
← →
Сергей М. © (2006-02-27 11:51) [8]
> Application.ProcessMessages
Этот вызов не только не допустим, но и бессмысленен в контексте любого кодового потока, отличного от основного.
← →
SamProf © (2006-02-27 11:52) [9]
Ну и что ?Зачем для этого
> формы в отдельных кодовых потоках создавать ?
Скажем на одной форме висит ftp клиент, на другой сидит копирование файлов, на третей выкачка файлов из инета и т.д. И если позапускать эти формы просто, то я думаю во время того, как одна форма нагрузится, то другие фиг чё сделают! Может я не прав! объесни, пожайлеста чайнику!
← →
Сергей М. © (2006-02-27 11:53) [10]
> отличного от основного
Еще точнее - отличного от того, в котором был создан объект Application
← →
SamProf © (2006-02-27 11:55) [11]
> > Application.ProcessMessagesЭтот вызов не только не допустим,
> но и бессмысленен в контексте любого кодового потока, отличного
> от основного.
Согласен, это чисто для теста!
То есть
> Создавать-то в общем случае можно.Но визуализировать нельзя.
Это как?
← →
Сергей М. © (2006-02-27 11:58) [12]
> на одной форме висит ftp клиент
Что значит "висит" ?
И для чего код ftp-клиента обязательно "вешать" именно на форму ?
procedure ttt.Execute;
begin
.. создать объект , реализующий логику FTP-клиента
.. поработать с этим объектом (та самая времяемкая операция)
.. известить, если нужно, ту или иную форму о результатах работы
.. уничтожить объект
end;
← →
Сергей М. © (2006-02-27 11:59) [13]
> Это как?
Ну ты же сам сказал - "Эта гадость выдаёт ошибку" !
"Гадость" в этом случае - конкретно метод Show(), как раз и визуализирующий форму.
← →
Style © (2006-02-27 12:01) [14]
> Cкажем на одной форме висит ftp клиент,
Полагаю что ftp клиент уже будет использовать как минимум 2 потока.
один для общения с сервером, второй для самого трансфера файлов... Причем оба потока скорее всего созданы из основного, после вызова определенной функции например connect.
> на другой сидит копирование файлов,
>на третей выкачка файлов из инета и т.д.
Эти опирации тоже можно выполнить в отдельном потоке.
← →
SamProf © (2006-02-27 12:02) [15]
> Что значит "висит" ?И для чего код ftp-клиента обязательно
> "вешать" именно на форму ?
Висит, это на ней находится IdFTP1 или ещё чего похожего! Я согласен, что можно эго создать и динамически, но ведь визуально то проще!
В общем, как я понимаю, хотя да конца не понимаю плчему, что в потоках нельзя создавать формы?
А очень хочется! То есть ну НИКАК?
← →
SamProf © (2006-02-27 12:04) [16]
> Ну ты же сам сказал - "Эта гадость выдаёт ошибку" !"Гадость"
> в этом случае - конкретно метод Show(), как раз и визуализирующий
> форму
У меня ушибку выдает именно CREATE!!!!! блин
← →
Style © (2006-02-27 12:06) [17]
> В общем, как я понимаю, хотя да конца не понимаю плчему,
> что в потоках нельзя создавать формы?
> А очень хочется! То есть ну НИКАК?
Да потому что обработкой оконных сообщений занимается основной поток...
← →
SamProf © (2006-02-27 12:09) [18]Хорошо, а если на одной из форм Image грузит 200 метровую картинку. Как я это в поток засуну, кроме как форма в отдельном потоке?
← →
SamProf © (2006-02-27 12:11) [19]
> Да потому что обработкой оконных сообщений занимается основной
> поток...
И тут до меня дошло!!!! СПАСИБО! однако обидно!
← →
sniknik © (2006-02-27 12:19) [20]> Хорошо, а если на одной из форм Image грузит 200 метровую картинку. Как я это в поток засуну, кроме как форма в
> отдельном потоке?
грузить в битмап в дополнительном потоке, после отработки присвоить его имеджу на форме в основном.
разделяй действие/данные и визуализацию.
← →
SamProf © (2006-02-27 12:19) [21]Извините за ещё очень глупый вопрос!
можно записать такой вот код:
form1:Tform1
f:Tform2;
f:=Tform2.create(nil);
f.parent:=form1.panel1;
Тогда форма будет в этой панели - ЭТО ВЕРНО!
А суть глупого вопроса в следующем! Можно ли запустить другую прогу, чтобы её форма была к меня в панели? глупо, прада? однако, чтобы удостоверится я спросил!
← →
Сергей М. © (2006-02-27 12:19) [22]
> 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;
← →
Сергей М. © (2006-02-27 12:22) [23]
> У меня ушибку выдает именно CREATE!!!!! блин
Попробуй сделать тоже самое с заведомо "пустой" формой, имеющей Visible = False
Удивись - исключение при выполнении Create не возникает !
Оно возникнек сразу же как только ты установишь Visible = True либо вызовешь любой из ее Show-методов.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.033 c