ВУЗ:
Составители:
Рубрика:
8
Синхронизация с VCL
Как упоминалось выше, вам следует получать доступ к свойствам или мето -
дам VCL только из основного потока приложения. Это значит, что любой код,
который получает доступ или обновляет данные пользовательского интерфейса
в приложении, должен выполняться только в контексте основного потока. Не-
достатки такой архитектуры вполне очевидны , и может показаться , что это тре-
бование слишком уж связывает вам руки, однако уже одно то , что вы знаете об
этом ограничении, дает определенное преимущество .
Преимущества однопоточного интерфейса пользователя
Прежде всего , наличие только одного потока, получающего доступ к интер-
фейсу пользователя , значительно уменьшает сложность приложения. В соот-
ветствии с требованиями Win32 каждый поток, создающий диалоговое окно ,
должен иметь собственный цикл сообщений на основе использования функции
GetMessage. Нетрудно представить , что наличие сообщений, приходящих от
различных источников, существенно затруднит отладку. Поскольку очередь со -
общений приложения сопряжена с последовательной их обработкой, т.е. пол-
ной обработкой одного сообщения перед переходом к следующему, то в боль -
шинстве случаев вы попадаете в зависимость от определенных сообщений,
приходящих до или после других . Добавление еще одного цикла сообще-
ний совершенно нарушает правила игры , существующие при последова-
тельном вводе, уступая дорогу потенциальным проблемам синхронизации и
вызывая необходимость добавления более сложной программной реализации,
предусматривающей решение этих проблем .
Кроме того , поскольку VCL может работать при условии доступа к ней толь -
ко одного потока в данный момент времени , то становится очевидной необхо-
димость создания кода для синхронизации нескольких потоков внутри VCL.
Сетевое решение приводит к улучшению общей производительности приложе-
ния благодаря более организованной архитектуре.
Метод Synchronize
В классе TThread определен метод Synchronize, который позволяет некото -
рым методам класса выполняться из основного потока приложения. Определе -
ние метода Synchronize имеет вид
procedure Synchronize(Method: TThreadMethod);
Параметр Method имеет тип TThreadMethod (означающий процедурный метод,
не принимающий никаких параметров), который определяется следующим об-
разом:
type
TThreadMethod = procedure of object;
Метод, передаваемый в качестве параметра Method, и является как раз тем
методом, который затем выполняется из основного потока приложения. Воз-
вращаясь назад к примеру с классом TTestThread, предположим, что мы хотим
отобразить результат вычислений в поле редактирования на главной форме.
Это можно сделать путем ввода в класс TTestThread метода, который вносит
8 С и н хрон и заци я с VCL К ак упо минало сь вы ш е, вам следуетпо лучать до ступ к сво йствам или мето- дам VCL только из о сно вно го по тока прило ж ения. Э то значит, что лю бо й ко д, ко торы й по лучаетдо ступ или о бно вляетданны е по льзо вательско го интерфейса в прило ж ении, до лж ен вы по лняться только в ко нтексте о сно вно го по тока. Н е- до статки тако й арх итектуры впо лне о чевидны , и мо ж етпо казаться, что это тре- бо вание слиш ко м уж связы ваетвам руки, о днако уж е о дно то, что вы знаете о б этом о граничении, даето пределенно епреимущ ество . П реи м ущ ес т ваодн оп от очн ог о и н т ерфейс ап ользоват еля П реж де всего , наличие только о дно го по тока, по лучаю щ его до ступ к интер- фейсу по льзо вателя, значительно уменьш аетсло ж но сть прило ж ения. В со о т- ветствии с требо ваниями Win32 каж ды й по ток, со здаю щ ий диало го во е о кно , до лж ен иметь со бственны й циклсо о бщ ений нао сно ве испо льзо вания функции GetMessage. Н ет рудно представить, что наличие со о бщ ений, прих о дящ их о т различны х источнико в, сущ ественно затруднито тладку. П о ско льку о чередьсо - о бщ ений прило ж ения со пряж ена с по следо вательно й их о брабо тко й, т.е. по л- но й о брабо тко й о дно го со о бщ ения перед перех о до м к следую щ ему, то в бо ль- ш инстве случаев вы по падаете в зависимо сть о т о пределенны х со о бщ ений, прих о дящ их до или по сле других . Д о бавление ещ е о дно го цикла со о бщ е- ний со верш енно наруш ает правила игры , сущ ествую щ ие при по следо ва- тельно м вво де, уступая до ро гу по тенциальны м про блемам синх ро низации и вы зы вая нео бх о димо сть до бавления бо лее сло ж но й про граммно й реализации, предусматриваю щ ей реш ениеэтих про блем. К ро ме того , по ско льку VCL мо ж етрабо татьпри усло вии до ступак ней толь- ко о дно го по тока в данны й мо ментвремени, то стано вится о чевидно й нео бх о - димо сть со здания ко да для синх ро низации неско льких по токо в внутри VCL. С етево е реш ение приво дитк улучш ению о бщ ей про изво дительно сти прило ж е- ния благо даря бо леео рганизо ванно й арх итектуре. М ет одSynchronize В классе TThread о пределен метод Synchronize, ко торы й по зво ляетнеко то- ры м методам класса вы по лняться из о сно вно го по тока прило ж ения. О пределе- ниеметодаSynchronize имеетвид procedure Synchronize(Method: TThreadMethod); П араметр Method имееттип TThreadMethod (о значаю щ ий про цедурны й метод, не принимаю щ ий никаких параметро в), ко торы й о пределяется следую щ им о б- разо м: type TThreadMethod = procedure of object; М етод, передаваемы й в качестве параметра Method, и является как раз тем методо м, ко торы й затем вы по лняется из о сно вно го по тока прило ж ения. В о з- вращ аясьназад к примерусклассо м TTestThread, предпо ло ж им, что мы х о тим о тобразить результатвы числений в по ле редактиро вания на главно й фо рме. Э то мо ж но сделать путем вво да в класс TTestThread метода, ко торы й вно сит
Страницы
- « первая
- ‹ предыдущая
- …
- 6
- 7
- 8
- 9
- 10
- …
- следующая ›
- последняя »