Метод Synchronize

procedure Synchronize(Method: TThreadMethod);

Метод используется для безопасного обращения к объектам VCL (формы и элементы управления) из потоков, отличных от потока формы. Для каждой формы в Delphi свой поток, управляющий ее поведением, и только из этого потока можно безопасно обращаться к форме и ее элементам управления, не используя средства синхронизации. Для обращения к форме из других потоков использование метода Synchronize обязательно. Вызов метода synchronize дает гарантию, что к каждому объекту одновременно имеет доступ только один поток, и таким образом исключается ситуация конфликта. Сложность проблемы в том, что Delphi не контролирует выполнение этого правила и не препятствует обращению в форме из другого потока, формального противоречия в данном случае нет, язык Object Pascal позволяет производить такое обращение. И в некоторых случая программа даже будет работать, но до момента наступления конфликта обращения различных потоков к форме. В принципе, такой конфликт может не происходить продолжительное время, в течение многократных запусков программы. Но затем обязательно произойдет и притом в самый ответственный момент. Отладка многопоточных программ одна из основных сложностей разработки таких программ. Ошибки взаимодействия потоков трудно «отловить», т.к. условия, приведшие к ошибке трудно возобновимы.

Метод Synchronize относится к секции protected, т. е. может быть вызван только из потомков TThread. Аргумент, передаваемый в метод Synchronize, - это имя метода, который производит обращение к VCL. Параметр метод (класса TThreadMethod) не должен иметь никаких параметров и не должен возвращать никаких значений. Обычно все операции по вводу-выводу данных потоком группируют в один или несколько таких методов, которые вызывают с помощью метода Synchronize. А проблема отсутствия параметров у метода, передаваемого в качестве аргумента решается за счет переменных уровня класса.

procedure TMainForm.SyncShowMessage; begin

ShowMessagedntToStr (ThreadListl. Count)); // другие обращения к VCL

end;

а в потоке для показа сообщения писать не

ShowMessage(IntToStr(ThreadListl.Count));

и даже не

MainForm.SyncShowMessage;

а только так:

Synchronize(MainForm.SyncShowMessage);

Итак, можно сформулировать основное правило обращения к формам и их элементам управления из потоков. Производя любое обращение к объекту VCL из потока, убедитесь, что при этом используется метод Synchronize; в противном случае результаты могут оказаться непредсказуемыми.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: