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

Вниз

Потоки и окна   Найти похожие ветки 

 
Digitman ©   (2001-12-11 15:33) [1]

>Cobalt
Видимо, ты не понимаешь (или не совсем понимаешь) разницы между системным объектом - окном Windows и VCL-объектом - формой Делфи.
Объект-окно Windows можно создать и в доп.потоке процесса, но обработка сообщений, посылаемых этому окну, должна и будет производиться в осн.потоке процесса.
Объект-форму нельзя создавать в доп.потоке, код вызова конструктора формы должен быть синхрогизирован любым доступным способом с осн.потоком процесса. При этом доп.поток также не сможет получать и обрабатывать сообщения окну, на котором базируется созданная доп.потоком формы.
Здесь нужно понять одно : очереди сообщений различных потоков никак не связаны друг с другом, существуют в системе параллельно и независимо друг от друга, и каждый поток сам ответственен за диспетчеризацию сообщений, посланных именно ему.
VCLобъект-форма наследует класс TWinControl, в котором Борландом уже инкапсулированы ф-ции ожидания, приема и диспетчеризации сообщений, адресованных окну формы. Т.е., заботиться о создании диспетчера очереди оконных сообщений при работе с формой не надо - он автоматически создается в реализации класса TWinControl.
Системный же объект-thread (тот самый, созданием и управлением которым "заведует" класс TThread) обязан сам контролировать в процессе своей работы очередь адресованных ему сообщений. С т.з. класса TThread это значит, что в коде его метода Execute должны присутствовать какие-либо вызовы API, предназначенные для работы с очередью сообщений потоку. Это могут быть вызовы из следующего ряда : GetMessage, PeekMessage, WaitMessage, MsgWaitForSingleObject, MsgWaitForMultipleObjects. Каждый из этих вызовов тем или иным образом обращается к системной очереди сообщений, созданной индивидуально для тек.доп.потока. В зависимости от конкретного вызова взаимодействие происходит по-разному : можно просто контролировать факт наличия сообщения в очереди, а можно и выбирать очередные сообщения из очереди (с ожиданием или без, с удалением из очереди или без оного - вариантов много). Здесь надо особо отметить, что ОС не создает очереди сообщений доп.потока безусловно (просто - по факту его старта). Очередь сообщений будет создана только при первом вызове одногq из вышеуказанных API-ф-ций. Поэтому сообщения, посланные потоку в период между его фактическим стартом и первым же вызовом им одной из вышеуказанных API-ф-ций, просто-напросто "пропадут" - будут посланы в "пустоту", как адресованные несуществующей еще в момент посылки сообщения очереди. Именно поэтому указанный период времени следует сокращать до минимума, и именно поэтому во многих реализациях метода Execute различных классов-наследников TThread одной из первых инструкций стоит инструкция PeekMessage, призванная создать очередь сообщений потока.

Создавать объект-форму в доп.потоке в подавляющем большинстве случаем просто бессмысленно и неоправданно, т.к. доп.потоки призваны реализовать параллельное функционирование непрерывных/циклических и длительных по времени вычислений. Форма же, как правило, "простаивает" в ожидании событий ввода/вывода, т.е. работает синхронно (есть ли смысл создавать и интенсивно работать с синхронными объектами в контексте асинхронных по сути объектов ?)



Страницы: 1 вся ветка

Текущий архив: 2002.02.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.011 c
14-42862
Макс
2001-12-24 13:08
2002.02.14
Help по EhLib


3-42641
wicked
2002-01-18 14:08
2002.02.14
тип TIMESTAMP


3-42656
Anton Shestakov
2002-01-19 02:10
2002.02.14
Внесение в базу данные2


4-42897
vivus
2001-12-18 10:47
2002.02.14
виндовая мессага.


1-42718
SAlex
2002-01-30 12:01
2002.02.14
<B>Text Object Model </B>