Ну вот для теста сделал примерно следующее:
Две формы 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 является то, что только главный поток должен быть единственным потоком, который обновляет компоненты, взаимодействующие с пользователем: иначе, приложение может зависнуть.
То есть в моем случае обработку изображений надо вынести в отдельный поток. чтобы главный поток приложения мог взаимодействовать с компонентами формы, или я ошибаюсь?