Создание многопоточных приложений. Копытин А.В - 8 стр.

UptoLike

Составители: 

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 метода, ко торы й вно сит