![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос про потоки и модальные формы
Starkom © (2002-04-18 09:34:00)есть простенький код:
var
Form1: TForm1;
Thread:SecThread;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Thread:=SecThread.Create(false);
Thread.FreeOnTerminate:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Thread.Suspend;
end;
...
procedure SecThread.Execute;
begin
Form2:=TForm3.Create(Form1);
Form2.Caption:="Thread";
Form2.ShowModal;
Form2.Free;
end;
Фактически кода больше нет. Так вот, при Thread.Suspend; приложение капитально повисает! Объясните, плиз, что делать!
Digitman (2002-04-19 08:32:00) [1]>kull
> метод который посылается в Synchronize выполняется в основном
> "кодовом" потоке
Чушь.
Метод, выполнение которого д.б.синхронизировано с использованием метода Synchronize(), выполняется в том потоке, который создал окно диспетчера объектов TThread.
kull (2002-04-18 17:19:00) [2]Ну и что - "Using Object Pascal with the VCL"?
Читали, читали как же...
Там написано про использование потоков и VCL вместе, но поток никакого отношения сам по себе к VCL не имеет.
Так вот чтоб ты знал: метод который посылается в Synchronize выполняется в основном "кодовом" потоке, (если ты сам не постараешься сделать иначе) - это я веду к тому.
А почитать, а особенно вникнуть и т.н. мастерам полезно будет.
Digitman (2002-04-18 17:07:00) [3]>kull
Слушай, сударь, вот тебе топик из "родного" Borland Delphi Help
"Using Object Pascal with the VCL"
Читай и вникай, это для тебя, кстати, писано в том числе.
И только потом будешь спорить по поводу - имеет отношение класс TTHread к VCL или не имеет.
И не путай понятия "метод объекта" как таковой и "кодовый поток, в котором выполняется метод объекта".
Набережных С. (2002-04-18 17:06:00) [4]
> Starkom
Если речь идет о D5, то, думаю, все дело в блокировке графического контекста. Доступ к канве осуществляется внутри критической секции - смотри глобальные объекты BitmapCanvasList в Graphics.pas и CanvasList в Controls.pas. Если дополнительный поток остановить внутри секции, то и основной повиснет, пытаясь попасть "внутрь". О D6 ничего сказать не могу - не знаю.
kull (2002-04-18 16:51:00) [5]А откуда делаются (по сути) Syncronize вызовы - из Application.WndProc, не из главного потока ли? Вот тебе и отдельная обработка сообщений потоками.
И не вижу никакой связи TThread с VCL - помоему просто обертка вокруг WINAPI...
Nicolas_ (2002-04-18 16:34:00) [6]>Digitman
Получается, что средствами Дельфи корректно реализовать это вообще невозможно?
Digitman (2002-04-18 16:30:00) [7]>Nicolas_
В этом-то и проблема класса TThread - такие ситуации им не предусмотрены, к сожалению.
Digitman (2002-04-18 16:28:00) [8]>kull
Смотри сколько тебе угодно, только смотришь ты не то, что следовало бы. Причем здесь - визуальный он или не визуальный, Tcomponent он или еще чего-то там ?
Функциональность базового объекта TThread реализована в classes.pas, который в vclxx.bpl играть важнейшую роль. Надеюсь, ты не станешь отрицать, что магическая аббревиатура "vcl" присутствует в имени небезызвестного файла по ошибке Борланда ?
Digitman (2002-04-18 16:26:00) [9]>kull
Смотри сколько тебе угодно, только смотришь ты не туда. Причем здесь - визуальный он или не визуальный, Tcomponent он или еще чего-то там ?
Функциональность базового объекта TThread реализована в classes.pas, который в vclxx.bpl играть важнейшую роль. Надеюсь, ты не станешь отрицать, что магическая аббревиатура "vcl" присутствует в имени небезызвестного файла по ошибке Борланда ?
Nicolas_ (2002-04-18 16:22:00) [10]Вопрос в тему.
В доп. потоке грузится DLL, в ней показывается окно, в которое идет вывод информации. Так при интенсивном выводе приложение напрочь виснет. Понятно, что нет синхронизации, т.е. если я закомментирую вывод - программа нормално работает. Но как можно сделать синхронизацию, если DLL не знает о том, что ее грузят в доп. потоке, то есть ни о каком методе Synchrohize не может быть и речи?
kull (2002-04-18 16:11:00) [11]TThread - это разве Visual Component?
А может это вообще не компонент...(посмотрим-ка на предков - TComponent-а там нет, странно.......)
Digitman (2002-04-18 15:49:00) [12]>kull
да что ты ?? неужто - бред ?? неужто объект thread с т.з. ОС ничем не отличается от объекта TThread c т.з VCL ?
kull (2002-04-18 15:32:00) [13]В TThread я залезал уже.
Вот только не могу понять что такое Э-м-м-м
VCL-поток.
Красиво конечно, но бред полный.
Digitman (2002-04-18 14:37:00) [14]>kull
А ты что, "типо" - на завалинку уселся семечки лузгать, а я - "типо" массовик-затейник ? :|
Лезь в модуль Classes.pas да смотри сам, что происходит в момент TThread.Create(). По крайней мере, загляни в FAQ - сей вопрос уже измыленный просто в форуме.
kull (2002-04-18 14:18:00) [15]
> диспетчера VCL-потоков
Что це за хреновина, интересно? А ну разъясни-ка,разъясни-ка - послушаем.
Starkom (2002-04-18 13:43:00) [16]хмм, смысл создавать модальную форму в дополнительном потоке есть - наследие предков.(Хотя я бы на месте предков сделал все совсем по-другому, исходного кода нет, и сроки поджимают)
Насчет Synchronize - попробуйте. Тогда форма основного потока не реагирует на события, вообще, никак. Поэтому все написано, помолившись и поплевав через плечо n раз, без какой-либо синхронизации.
Digitman (2002-04-18 13:22:00) [17]P.S.
Ошибочка
Имелось ввиду - "...искл-но в осн.потоке"
Digitman (2002-04-18 13:20:00) [18]>kull
Разумеется, это бессмысленно ! Тем более - модальной формы.
Но я несколько о другом - о том, что, якобы, ОС-окно создается и обрабатывает системные (и не только) события искл-но в доп.потоке. Окно можно создать и обрабатывать его события в любом потоке, в т.ч. дополнительном. Но при попытке асинхронного доступа в теле обработчика события (если обработчик работает в доп.потоке) к разделяемым ресурсам ОС могут возникнуть коллизии. И метод Synchronize() в таких случаях не всегда гарантирует синхронизацию доступа для избежания подобных коллизий. Связано это как раз с тем, что ОС-окна диспетчера VCL-потоков и целеыой формы (модальной или не модальной - по-барабану) создаются в доп.потоке, а, значит, и обрабатывать сообщения, адресованные им - хотим мы этого или нет - придется в том же потоке, что их и создал.
kull (2002-04-18 12:42:00) [19]Так какая цель создания формы в другом потоке?
Digitman (2002-04-18 12:02:00) [20]>kull
> И при создании формы , думаю что в Delphi окна создаются
> при главном потоке.
Совершенно не обязательно.