Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
3-1139565329
Polevi
2006-02-10 12:55
2006.04.02
Приходный ордер форма № М-4


2-1142425631
Fenix
2006-03-15 15:27
2006.04.02
Динамическое создание элементов ListView


4-1137272874
Delphi_is_cool
2006-01-15 00:07
2006.04.02
Убрать края у окна


15-1142254134
Ironkad
2006-03-13 15:48
2006.04.02
вопрос


1-1141213505
Aleksandr.
2006-03-01 14:45
2006.04.02
Что случилось с GetHeapStatus?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский