Ну вот для теста сделал примерно следующее:
Две формы Form1, Form2. На Form1 кнопка Button1
в uses подключаем unit2
- Код: Выделить всё
- interface
 
 uses
 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, unit2;
 ...
 //создадим класс потока
 type
 
 { NewThread }
 
 NewThread=class(TThread)
 private
 k:integer;
 protected
 procedure PrBar;
 procedure Execute; override;
 end;
 
//тут основная процедура потока
- Код: Выделить всё
- //тут основная процедура потока
 procedure NewThread.Execute;
 var
 i:integer;
 begin
 for i:=0 to 10000000 do begin
 k:=i;
 sleep(100);
 Synchronize(@PrBar);
 end;
 end;
 
- Код: Выделить всё
- // процедура синхронизации
 procedure NewThread.PrBar;
 begin
 Form2.ProgressBar1.Position:=k;
 end;
 
В обработчике Button1Click:
- Код: Выделить всё
- procedure TForm1.Button1Click(Sender: TObject);
 var
 FirstThread:NewThread;
 begin
 FirstThread:=NewThread.Create(false);
 FirstThread.Priority:=tpNormal;;
 Form2.ShowModal;
 end;
 
Запускаем, жмем на кнопку - открывается модальная форма и заполняется прогресс бар.
Если это идеологически верно, то как мне теперь закрыть модальное окно?
Добавлено спустя 3 минуты 25 секунд:Снег Север писал(а):Если программе надо ждать результатов основных вычислений, то их и делать в основном потоке. А прогресбар обрабатывать в дополнительном
А я вот не помню где, читал, что главным правилом при работе с потоками в Lazarus является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
То есть в моем случае обработку изображений надо вынести в отдельный поток. чтобы главный поток приложения мог взаимодействовать с компонентами формы, или я ошибаюсь?