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

Вниз

вопрос про потоки и модальные формы   Найти похожие ветки 

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

Наверх




Память: 0.53 MB
Время: 0.011 c
14-2683
Santus
2002-03-25 20:38
2002.05.02
Нет


1-2532
Ежик2
2002-04-21 19:23
2002.05.02
А где берут модуль Match?


1-2519
Анастасия
2002-04-21 10:52
2002.05.02
hint ы в форме облаков


3-2465
Tolstomordik
2002-04-11 10:00
2002.05.02
Сохранение результатов SQL-запроса во внешний файл.


1-2534
PaRL
2002-04-18 18:06
2002.05.02
The Question. Simply Question.