Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

Запуск формы в другом потоке   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.041 c
11-1123493830
Dodfr
2005-08-08 13:37
2006.04.02
Keep TListView.curindex visible when set out of view range


4-1136977878
Free0n
2006-01-11 14:11
2006.04.02
Нужно обнаружить одну хитрую программу....


1-1141332630
Gear
2006-03-02 23:50
2006.04.02
Блокирование запуска чужого приложения во время исполнения ...


9-1127639612
D@rk
2005-09-25 13:13
2006.04.02
Directdraw help


15-1142062536
zac
2006-03-11 10:35
2006.04.02
микрофон