Многопоточность Delphi[3]. Синхронизация

Продолжаем тему многопоточности Delphi.

Сегодня рассматриваем синхронизацию потоков.

Что это вообще такое и зачем оно нужно?

Рассмотрим первый пример. Допустим мы создали поток, который выполняется параллельно с основным.
Основной поток постоянно ведёт какие-либо расчёты и записывает их в элемент label. Дочерний же поток
так же ведёт какие-либо расчёты, и время-от-времени ведёт запись в тот же label.
Если 2 потока будут вести запись в один и тот же элемент, то данные перемешаются и разбирать их будет крайне неприятно.
Именно из-за таких ситуаций, грубо говоря, потоки всегда нужно "обезопасить" друг от друга или по-другому синхронизировать.

Для синхронизации подобного рода есть несколько способов. Первый, который сегодня и рассмотрим - это метод Synchronize.
Процедура Synchronize блокирует одновременный доступ к элементу нескольким потокам, кроме того, в котором вызвана сама процедура. Что бы его применить, нужно обязательно вывести в отдельную процедуру действие, которое дочерний поток будет делать параллельно с основным (в примере, рассмотренном выше это действие было запись данных в label).
Допустим эту процедуру так:

Procedure MyThread.WriteLabel;
begin
	form1.label1.caption:= s;
end; 


где s - переменная типа string, в которой содержаться данные для записи в label.
Вызывается она следующим образом:

Synchronize (WriteLabel);


Теперь когда поток будет вносить данные в label, с которым в этот момент работает основной поток, данные запишутся без ошибки и по порядку.
Но прежде чем использовать метод Synchronize обязательно учитывайте 1 важный фактор - частый вызов Synchronize тормозит выполнение программы.
Этот способ самый универсальный, и в принципе можно использовать его.

На этом тему сисек синхронизации потоков мы только приоткрыли. Так что цикл статей будет продолжаться :)
Теги:
поток, label, Synchronize, будет, данные, ведёт, запись, нужно, расчёты, синхронизации, основным, элемент, метод, использовать, параллельно, WriteLabel, обязательно, какие, действие, потоков
Добавлено: 24 Февраля 2015 21:49:43 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...