Потоки в Lazarus

tthreadПотоки в Lazarus создаются так же как и в Delphi. Для тех кто никогда не работал с потоками и не знают зачем они нужны, поясню: Основная идея создания потоков в том, что приложение может производить некоторую обработку информации в фоновом режиме во втором потоке, для избежания зависания интерфейса программы, а пользователь может продолжать работу с помощью основного потока. Основной поток создается автоматически ОС при запуске приложения.

Главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.

Если при работе в потоке, нужно обновить видимый компонент, то можно применить метод Synchronize. Когда вы вызываете метод через Synchronize(@MyMethod), запущенный поток приостанавливается, код метода MyMethod запускается в главном потоке, а затем выполнение потока будет продолжено.

Итак. Создадим приложение, и добавим следующий код:

type
  MyThread=class(TThread)   //Указываем имя 
private
  results:integer;          //Переменная в которой будут хранитя вычисления
protected
  procedure ShowResult;     //Процедура которая будем показывать результат
  procedure Execute;        //Основной код потока.
end;

Для облегчения создания функций\процедур в приложении, можно поставить курсор на процедуру, нажать Shift+Ctrl+C и Lazarus автоматически создаст скилет данной процедуры ниже. Напишем код для процедуры Execute:

procedure MyThread.Execute;
var
  i:integer;
begin
  results:=0;
  for i:=1 to 65535 do
  begin
    inc(results);             //Прибавляем к значению 1
    Synchronize(@ShowResult); //Выводим результат
  end;
end;

Процедура ShowResult:

procedure MyThread.ShowResult;
begin
   Form1.Edit1.Text:=IntToStr(results);   //Переводим целое значение в строку и выводим в Edit1
end;

Напоминаю что данная процедура будет запускаться основным потоком, благодаря Synchronize.

Как вы понимаете на форме должны присутствовать 1 Edit и кнопка которая будет запускать наш поток.

Код для кнопки запуска потока, добавим следующий:

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadBegin:MyThread;
begin
  ThreadBegin:=MyThread.Create(False); //Создаем и запускаем поток
  ThreadBegin.Priority:=tpNormal;      //Приоритет потока
end;

Готово. Исходники Скачать 586Кб

 

Потоки в Lazarus обновлено: 20 апреля, 2016 автором: Oleg E.
Share

5 комментариев “Потоки в Lazarus

  1. Про анонимные потоки что можете сказать? В интернете маловато примеров на Lazarus.

    • Добрый день. Честно говоря не пробовал использовать анонимные процедуры в Lazarus. Гоогл говорит что использовать их можно только в Delphi.

  2. Здравствуйте, я сделал приложение на подобии драм-машины, привязал к каждой кнопке сэмпл, но проблема в том что они все воспроизводятся в одной потоке, то есть при нажатии сразу на два звука, второй прерывает первый.
    Задумался над распоточиванием, может есть идеи как это реализовать со звуками?

    • Добрый день, Марат.
      Вам необходимо вопроизводить звуки в отдельном потоке.
      Создаете процедуру с передаваемым параметром(Какой звук воспроизводить) и запускаете эту процедуру в отдельном потоке.

  3. Рассказ о Synchronize (некий аналог SendMessage) будет не полон, если не упомянуть, что у потоков также есть метод Queue(некий аналог PostMessage)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *