Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.77 MB
Время: 0.031 c
3-2477            Pashafess             2002-04-09 05:34  2002.05.02  
Перенос данных из одной базы в другую запросом в InterBase 5.x.


7-2701            ATLANTIDO             2002-02-07 20:53  2002.05.02  
ОПЕРАЦИОНКА


6-2642            cypher                2002-02-18 18:19  2002.05.02  
Сетевые диски


14-2681           Malder                2002-03-25 13:03  2002.05.02  
Книга Архангельский А.Я.


7-2708            Mainstream            2002-02-05 13:52  2002.05.02  
Properites