Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.91 MB
Время: 0.037 c
14-2651
pierre
2002-03-26 17:59
2002.05.02
Ms-dos


4-2727
JAndrey
2002-02-28 07:11
2002.05.02
Как запустить и остановить Скрин Сервер?


1-2504
ATLANTIDO
2002-04-19 21:36
2002.05.02
окрасить BitBtn


1-2587
vcrits
2002-04-19 17:36
2002.05.02
Как можно сделать в Delphi 6 из ActiveX библиотеки


3-2451
koks
2002-04-10 11:15
2002.05.02
QReport без DataSet - а





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский