Форум: "Основная";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
Внизвопрос про потоки и модальные формы Найти похожие ветки
← →
Starkom (2002-04-18 09:34) [0]есть простенький код:
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; приложение капитально повисает! Объясните, плиз, что делать!
← →
kull (2002-04-18 10:39) [1]Я так думаю, Suspend приостанавливает поток и модальная форма перестает обрабатывать события до тех пор пока поток не отпустишь (Resume).
← →
Starkom (2002-04-18 10:56) [2]2 kull:
дело в том, что до суспенда я могу свободно переключаться на Form1, хотя Form2 и модальная. А после суспенда приложение, вообще, не реагирует ни на что.
← →
kull (2002-04-18 11:11) [3]А зачем создавать модально форму не в главном потоке.
← →
Digitman (2002-04-18 11:36) [4]Где синхронизация методов конструирования формы и обращения к методам формы в процедуре Execute() ?
← →
Shaman_Naydak (2002-04-18 11:45) [5]VCL писали без поддержки многопоточности.. Потому-то и геморр, особенно с таким хрупким методом как ShowModal (исходники посмотрите)
← →
kull (2002-04-18 11:58) [6]С формами в потоке, я думаю все тоньше - это уже системный уровень.
Системные события обрабатывает главный поток (если только системе не указать что-то дополнительно).
И при создании формы , думаю что в Delphi окна создаются при главном потоке.
Так какая цель создания формы в другом потоке?
← →
Digitman (2002-04-18 12:02) [7]>kull
> И при создании формы , думаю что в Delphi окна создаются
> при главном потоке.
Совершенно не обязательно.
← →
kull (2002-04-18 12:42) [8]Так какая цель создания формы в другом потоке?
← →
Digitman (2002-04-18 13:20) [9]>kull
Разумеется, это бессмысленно ! Тем более - модальной формы.
Но я несколько о другом - о том, что, якобы, ОС-окно создается и обрабатывает системные (и не только) события искл-но в доп.потоке. Окно можно создать и обрабатывать его события в любом потоке, в т.ч. дополнительном. Но при попытке асинхронного доступа в теле обработчика события (если обработчик работает в доп.потоке) к разделяемым ресурсам ОС могут возникнуть коллизии. И метод Synchronize() в таких случаях не всегда гарантирует синхронизацию доступа для избежания подобных коллизий. Связано это как раз с тем, что ОС-окна диспетчера VCL-потоков и целеыой формы (модальной или не модальной - по-барабану) создаются в доп.потоке, а, значит, и обрабатывать сообщения, адресованные им - хотим мы этого или нет - придется в том же потоке, что их и создал.
← →
Digitman (2002-04-18 13:22) [10]P.S.
Ошибочка
Имелось ввиду - "...искл-но в осн.потоке"
← →
Starkom (2002-04-18 13:43) [11]хмм, смысл создавать модальную форму в дополнительном потоке есть - наследие предков.(Хотя я бы на месте предков сделал все совсем по-другому, исходного кода нет, и сроки поджимают)
Насчет Synchronize - попробуйте. Тогда форма основного потока не реагирует на события, вообще, никак. Поэтому все написано, помолившись и поплевав через плечо n раз, без какой-либо синхронизации.
← →
kull (2002-04-18 14:18) [12]
> диспетчера VCL-потоков
Что це за хреновина, интересно? А ну разъясни-ка,разъясни-ка - послушаем.
← →
Digitman (2002-04-18 14:37) [13]>kull
А ты что, "типо" - на завалинку уселся семечки лузгать, а я - "типо" массовик-затейник ? :|
Лезь в модуль Classes.pas да смотри сам, что происходит в момент TThread.Create(). По крайней мере, загляни в FAQ - сей вопрос уже измыленный просто в форуме.
← →
kull (2002-04-18 15:32) [14]В TThread я залезал уже.
Вот только не могу понять что такое Э-м-м-м
VCL-поток.
Красиво конечно, но бред полный.
← →
Digitman (2002-04-18 15:49) [15]>kull
да что ты ?? неужто - бред ?? неужто объект thread с т.з. ОС ничем не отличается от объекта TThread c т.з VCL ?
← →
kull (2002-04-18 16:11) [16]TThread - это разве Visual Component?
А может это вообще не компонент...(посмотрим-ка на предков - TComponent-а там нет, странно.......)
← →
Nicolas_ (2002-04-18 16:22) [17]Вопрос в тему.
В доп. потоке грузится DLL, в ней показывается окно, в которое идет вывод информации. Так при интенсивном выводе приложение напрочь виснет. Понятно, что нет синхронизации, т.е. если я закомментирую вывод - программа нормално работает. Но как можно сделать синхронизацию, если DLL не знает о том, что ее грузят в доп. потоке, то есть ни о каком методе Synchrohize не может быть и речи?
← →
Digitman (2002-04-18 16:26) [18]>kull
Смотри сколько тебе угодно, только смотришь ты не туда. Причем здесь - визуальный он или не визуальный, Tcomponent он или еще чего-то там ?
Функциональность базового объекта TThread реализована в classes.pas, который в vclxx.bpl играть важнейшую роль. Надеюсь, ты не станешь отрицать, что магическая аббревиатура "vcl" присутствует в имени небезызвестного файла по ошибке Борланда ?
← →
Digitman (2002-04-18 16:28) [19]>kull
Смотри сколько тебе угодно, только смотришь ты не то, что следовало бы. Причем здесь - визуальный он или не визуальный, Tcomponent он или еще чего-то там ?
Функциональность базового объекта TThread реализована в classes.pas, который в vclxx.bpl играть важнейшую роль. Надеюсь, ты не станешь отрицать, что магическая аббревиатура "vcl" присутствует в имени небезызвестного файла по ошибке Борланда ?
← →
Digitman (2002-04-18 16:30) [20]>Nicolas_
В этом-то и проблема класса TThread - такие ситуации им не предусмотрены, к сожалению.
← →
Nicolas_ (2002-04-18 16:34) [21]>Digitman
Получается, что средствами Дельфи корректно реализовать это вообще невозможно?
← →
kull (2002-04-18 16:51) [22]А откуда делаются (по сути) Syncronize вызовы - из Application.WndProc, не из главного потока ли? Вот тебе и отдельная обработка сообщений потоками.
И не вижу никакой связи TThread с VCL - помоему просто обертка вокруг WINAPI...
← →
Набережных С. (2002-04-18 17:06) [23]
> Starkom
Если речь идет о D5, то, думаю, все дело в блокировке графического контекста. Доступ к канве осуществляется внутри критической секции - смотри глобальные объекты BitmapCanvasList в Graphics.pas и CanvasList в Controls.pas. Если дополнительный поток остановить внутри секции, то и основной повиснет, пытаясь попасть "внутрь". О D6 ничего сказать не могу - не знаю.
← →
Digitman (2002-04-18 17:07) [24]>kull
Слушай, сударь, вот тебе топик из "родного" Borland Delphi Help
"Using Object Pascal with the VCL"
Читай и вникай, это для тебя, кстати, писано в том числе.
И только потом будешь спорить по поводу - имеет отношение класс TTHread к VCL или не имеет.
И не путай понятия "метод объекта" как таковой и "кодовый поток, в котором выполняется метод объекта".
← →
kull (2002-04-18 17:19) [25]Ну и что - "Using Object Pascal with the VCL"?
Читали, читали как же...
Там написано про использование потоков и VCL вместе, но поток никакого отношения сам по себе к VCL не имеет.
Так вот чтоб ты знал: метод который посылается в Synchronize выполняется в основном "кодовом" потоке, (если ты сам не постараешься сделать иначе) - это я веду к тому.
А почитать, а особенно вникнуть и т.н. мастерам полезно будет.
← →
Digitman (2002-04-19 08:32) [26]>kull
> метод который посылается в Synchronize выполняется в основном
> "кодовом" потоке
Чушь.
Метод, выполнение которого д.б.синхронизировано с использованием метода Synchronize(), выполняется в том потоке, который создал окно диспетчера объектов TThread.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c