Потоки в 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.
Добрый день. Честно говоря не пробовал использовать анонимные процедуры в Lazarus. Гоогл говорит что использовать их можно только в Delphi.
Здравствуйте, я сделал приложение на подобии драм-машины, привязал к каждой кнопке сэмпл, но проблема в том что они все воспроизводятся в одной потоке, то есть при нажатии сразу на два звука, второй прерывает первый.
Задумался над распоточиванием, может есть идеи как это реализовать со звуками?
Добрый день, Марат.
Вам необходимо вопроизводить звуки в отдельном потоке.
Создаете процедуру с передаваемым параметром(Какой звук воспроизводить) и запускаете эту процедуру в отдельном потоке.
Рассказ о Synchronize (некий аналог SendMessage) будет не полон, если не упомянуть, что у потоков также есть метод Queue(некий аналог PostMessage)