Продолжаем тему многопоточности 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 тормозит выполнение программы.
Этот способ самый универсальный, и в принципе можно использовать его.
На этом тему сисек синхронизации потоков мы только приоткрыли. Так что цикл статей будет продолжаться :)